【发布时间】:2017-06-01 01:21:10
【问题描述】:
我正在处理 Kafka 的第一英里问题。每个人都处理分区等问题,但是如何处理第一英里?
我的系统由许多应用程序组成,这些应用程序产生分布在节点上的事件。我需要以可靠/故障安全的方式将这些事件传递给一组充当消费者的应用程序。选择的消息传递系统是 Kafka(由于它的日志性质),但它并不是一成不变的。
事件应尽可能以解耦的即发即弃的方式传播。这意味着生产者应该对可靠地传递他们的消息负全部责任。这意味着产生事件的应用根本不应该担心事件传递。
生产者的可靠性模式必须考虑:
- 盒子连接中断 - 在中断期间生产者根本无法访问网络;因此无法访问 Kafka 集群
- box restart - 生产者和事件生产应用程序重启(独立);生产者应该保留正在进行的消息(在重试、批处理等期间)
- 内部 Kafka 异常 - 消息太大;序列化异常;等
到目前为止,我检查过的任何库都没有涵盖这些情况。有没有建议的策略来解决这个问题?
我知道在 Producer 的send() 期间存在可重试和不可重试错误。对于那些可重试的,库通常在内部处理所有事情。但是,不可重试以异步回调中的异常结束...
我应该盲目地把这些回放到无穷大吗?对于网络中断,它应该可以工作,但是 Kafka 内部错误怎么样——比如消息太大。可能存在类似 DeadLetterQueue 的机制 + 重放。但是,如何处理消息计数...
关于持久性——一个轻量级的数据库后端应该可以解决这个问题。只需创建一个持久队列,然后删除那些已经发送/确认的。但是,如果它这么简单,恐怕很久以前它就已经在标准的 Kafka 库中实现了。性能可能会下降。
看到KAFKA-3686 或KAFKA-1955 之类的东西让我有点担心。
提前致谢。
【问题讨论】:
标签: apache-kafka message-queue messaging reliability producer