Kafka 是目前比较热门的一个分布式消息系统,以高并发、高吞吐著称。
poseidon 支持 Kafka-0.8 以上版本,是 kafka 官方推荐的用于 ruby 程序的 gem,可以方便的生产消息,作为 producer 是比较好用的。 但是 poseidon 对于消费消息支持有限,只能指定 topic 和 partion 进行消费(这一点和该 gem 的作者本身确认过,然后他给我推荐了 poseidon_cluster)。
posidon 本身在消费消息时,只能指定 topic 和 partion 进行消费,而在实际应用中,我们往往更加关注某一个 topic 下的所有消息, 并不关心到底存储在哪个 partion 中。所以,poseidon_cluster 这个 gem 就应运而生。
在实际使用过程中发现,在使用 fetch_loop 时,如果长时间没有新消息产生(大概是 1 分钟左右),则在一定时间后,该方法会抛出异常。 在网上搜索发现,有其他人遇到了类似的问题,但是没有一个良好的解决方案。
之后,我仔细阅读了该 gem 的文档和部分相关源码,发现出现异常的原因是在调用系统的 select 方法时超时,而这个超时时间是可以设置的。 试验发现,在将超时时间设置为 48 小时后,在 18 小时内没有收到新消息时,fetch_loop 对应的进程仍然正常运行,没有抛出异常,再次产生新消息时仍然可以正常消费。
后续会补充一些具体的示例和试验过程。