Gem Rails 中使用 Kafka 的 gem 介绍

tomlk · 2015年09月03日 · 最后由 tomlk 回复于 2015年09月08日 · 5454 次阅读

简介

Kafka 是目前比较热门的一个分布式消息系统,以高并发、高吞吐著称。

Kafka 相关资料

官方文档:http://kafka.apache.org/

官方推荐的处理 Kafka 的 gem--poseidon

poseidon 支持 Kafka-0.8 以上版本,是 kafka 官方推荐的用于 ruby 程序的 gem,可以方便的生产消息,作为 producer 是比较好用的。 但是 poseidon 对于消费消息支持有限,只能指定 topic 和 partion 进行消费(这一点和该 gem 的作者本身确认过,然后他给我推荐了 poseidon_cluster)。

Kafka 消费消息的 gem--poseidon_cluster

由来

posidon 本身在消费消息时,只能指定 topic 和 partion 进行消费,而在实际应用中,我们往往更加关注某一个 topic 下的所有消息, 并不关心到底存储在哪个 partion 中。所以,poseidon_cluster 这个 gem 就应运而生。

遇到的问题

在实际使用过程中发现,在使用 fetch_loop 时,如果长时间没有新消息产生(大概是 1 分钟左右),则在一定时间后,该方法会抛出异常。 在网上搜索发现,有其他人遇到了类似的问题,但是没有一个良好的解决方案。

之后,我仔细阅读了该 gem 的文档和部分相关源码,发现出现异常的原因是在调用系统的 select 方法时超时,而这个超时时间是可以设置的。 试验发现,在将超时时间设置为 48 小时后,在 18 小时内没有收到新消息时,fetch_loop 对应的进程仍然正常运行,没有抛出异常,再次产生新消息时仍然可以正常消费。

TODO

后续会补充一些具体的示例和试验过程。

Kafka 和MessageBus比较过吗?我最近使用后者实现消息通信。

Kafka 是 scala 写的,最早用来处理日志中的事件的。不知道楼主放到 ruby 里做什么?

#2 楼 @jimrokliu 可以用来做服务间异步调用,丢出去不用管那种,不知道楼主是不是也用来做这个

摸索过一段时间,最后还是换成 RabbitMQ 了。。

#3 楼 @dy1901 是的。多个项目(比如 ruby 项目和 java 项目)间进行异步通信

#1 楼 @dongli1985 这个暂时还没有做过比较。

#2 楼 @jimrokliu kafka 可以用来进行服务间的异步通信,也可以在单个项目内进行异步处理的。这个在各个语言中其实都有可能要用到。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号