У меня есть небольшой проект, который использует Redis для задач очереди задач. Вот как это работает в принципе.Использование Kafka вместо Redis для целей очереди
У меня есть два компонента в системе: настольный клиент (может быть более чем один) и на стороне сервера приложений. У серверного приложения есть выбор задач для настольных клиентов. Когда клиент приходит, ему предоставляется первая доступная задача от тяги. Поскольку задача имеет идентификатор, когда клиент рабочего стола возвращается с результатами, серверное приложение может распознавать задачу по ее идентификатору. В основном, я делаю следующее в Redis:
- Сохраняйте все задачи как объекты.
- очередь Keep (пул) задачи в нескольких списках: очередь, при условии, обработки.
Когда задача предоставляется на рабочий стол клиента, я использую RPOPLPUSH в Redis, чтобы переместить идентификатор из списка очереди в список при условии.
Когда я получаю ответ от настольного клиента, я использую LREM для данного идентификатора задачи из , предоставленного (если он не работает, я получил задание, которое не было предоставлено или уже обработано, или просто никогда не существовало - так, я нарушаю исполнение). Затем я использую LPUSH для добавления идентификатора задачи в список . Учитывая, что у меня есть уникальные идентификаторы задач (контролируемые на уровне моего приложения), я избегаю дубликатов в списках Redis.
Когда задача завершена (результат получен от клиента рабочего стола обрабатывается и как-то сохранен), я удаляю задачу из списка обработки и удаляю объект задачи из Redis.
Если что-то пойдет не так на любом этапе (т. Е. Задача застревает в списке обработки или предоставления), я могу переместить задачу обратно в список очередей и перепрограммировать ее.
Теперь вопрос: как-то можно сделать аналогичный материал в Apache Kafka? Мне не нужно точного поведения, как в Redis - все, что мне нужно, - это предоставить задачу настольному клиенту (не должно быть возможности предоставить одну и ту же задачу дважды) и пометить/изменить его состояние в соответствии с фактическим статус обработки (новый, предоставленный, обработка), чтобы я мог контролировать процесс и восстанавливать задачи, которые не были обработаны из-за некоторых проблем. Если это возможно, может ли кто-нибудь описать применимый рабочий процесс?