Pull to refresh

Comments 16

Я почему-то думал, что под "строго однократной доставкой сообщения" понимается решение на стороне отправителя, а по факту это прослойка на получателе с заведомо надежным каналом до API. Отправитель-то в итоге все равно будет перепосылать сообщения, если ответ от получателя не дошел.

UFO just landed and posted this here
Tarantool в качестве альтернативы не рассматривался?
UFO just landed and posted this here
Вот Go приложение отправляет сообщение в кафку и сразу падает, и приложение еще не знает, отправил или нет. И отправляет еще раз. И получаете дубликат сообщения.
Вот это наверное уже читали: https://news.ycombinator.com/item?id=14670801?

Больше выглядит что проблема в самом протоколе, т.к. "доставить хотя бы один раз" и "проверить совпадение данных" — это так работают множество успешных проприетарных протоколов без необходимости городить аппарат согласования.


Во-вторых, все эти допущения о размере по сути "кеша" сообщений вызывают у меня тихий ужас, когда такой дизайн связан в финансами. При переполнении всё равно не достигнута заявленная цель "доставить один раз".


Если вопрос стоит о снижении нагрузки на ядро для избежания обработки дубликатов. Ну, сделайте промежуточный узел с кешем. Если предыдущий запрос есть в кеше в таком же виде и имеется результат, отдайте ответ без обработки в ядре. Если нет, пересылайте в ядро — это не то же, что "доставить ровно один раз".


Возможно авторы именно это и сделали, я упустил момент где клиент получает ответ на повтор.


Использованный термин "дедупликация" как-то из оперы об эффективном хранении данных, а не обмене сообщениями. Тут скорей нужно придумать "deretransmission".

Deretransmission опять упрется в неполучение ACK отправителем. Разве что делать полноценные keep-alive соединения с двунаправленным трафиком, но тогда теряется сам смысл попытки уменьшить трафик путем уменьшения количества переданных сообщений. А с дедупликацией принятого должен справляться сам TCP.

deduplication vs deretransmission — всего-лишь игра терминов, не знаю как вам удалось притащить сюда TCP.


Уменьшения трафика между мобильным приложением и входом API не решается в условиях задачи.

Настоящий exactly-once с кафкой все равно придется делать на стороне клиента (receiver), такая уж у него архитектура.
Или используя подобное решение, или делать ack после каждого сообщения (прощай пропускная способность).
UFO just landed and posted this here
В Kafka 0.11 поддерживается exactly once доставка сообщений. Эту фичу проще всего использовать через стримы. Там как раз под капотом используется RocksDB
Да, это стандартный подход в Kafka. Partition — единица параллелизма.
Скажите, а есть ли гарантия доставки сообщений у кафки. Терялись ли на ваших объемах сообщения?
Это перевод статьи. Да, есть до версии 0.11 Kafka придерживалась концепции «at least once» т.е. гарантируется отсутствие потрерь, но возможны дубли. У нас на объёмах того же порядка потерь пока нет. Дубли есть. Подробнее можно посмотреть здесь, но дизайн системы, описанный в статье мне понравился больше.
Какой-то дикий трех-кратный оверхед.
Пожалуйста, укажите суточное кол-во сообщений, кол-во сообщений в пике за минуту.

P.S. еще раз перечитайте литературу по теории массового обслуживания.
Sign up to leave a comment.

Articles