声明。 我有Hazelcast和Vert.x方面的经验。我是Apache Kafka的新手。对不起,如果我的问题看起来先入为主,那就不是。
有两种广泛的方式来安排微服务之间的通信:REST和消息传递。在我所在的地区,当有人说他们正在使用消息传递微服务之间的通信时 - 事实上它意味着Apache Kafka。
你能不能帮我找到一个线索,为什么Apache Kafka比Hazelcast的主题更适合微服务之间的通信需求?好点吗?由于哪些保证,功能或架构决策?
Hazelcast的集群范围消息传递示例如下:
// node #1
Hazelcast.newHazelcastInstance()
.getTopic("topic")
.publish(new Date());
// node #2
Hazelcast.newHazelcastInstance()
.getTopic("topic");
.addMessageListener(message -> /*Do something here*/);
还有一些Vertmel(非常反对的演员框架)是在Hazelcast的主题和成员发现之上编写的。
Kafka消息传递更适合微服务之间的通信吗?
答案 0 :(得分:9)
这是一个通用的问题,我不是卡夫卡专家;但我会尝试讲述Hazelcast的消息功能。
Hazelcast包含两类主题;一个是常规ITopic
,另一个是可靠主题,它再次实现ITopic
接口。用法大致相同,但它们保证的不同。常规ITopic
基于Hazelcast的事件机制,并不保证邮件传递。可靠主题由Ringbuffer
备份,并且由于Ringbuffer默认配置了一个同步备份,因此事件不会丢失。此外,每个Reliable ITopic
都有自己的Ringbuffer;如果一个主题有一个非常快的制作人,它不会导致以较慢的速度运行的主题出现问题。最后,由于常规ITopic
后面的事件系统与其他数据结构(例如集合侦听器)共享,因此可能会遇到隔离问题。 Reliable ITopic
不会发生这种情况。但是由于所有这些缺点,常规ITopic
可以运行得更快,因为它使用了fire& forget eventing机制。
Apache Kafka有其巨大的优势;例如它全部构建为具有临时持久性日志的消息流平台,因此能够将数据存储到磁盘以实现容错。
总之,如果您需要消息持久性以及应用程序上的消息传递所需的所有功能,请使用Kafka,因为它更专业。但是,如果您需要包含对消息传递支持的内存数据平台,请使用Hazelcast。
答案 1 :(得分:0)
Kafka 的消息传递模型/通信与其他可用的主流消息传递基础架构明显不同。虽然大多数消息传递基础都明确区分了主题和队列,但 Kafka 严格没有。 它的主题既可以作为主题也可以作为队列,这种灵活性在 Hazelcast 中是不可用的。
现在。从微服务设计的角度来看,就设计选项而言,这可能会产生很大的不同。任何利用消息传递的微服务本质上都是通过异步通道进行的明显同步通信,例如 NGINX 模型。
从这个角度来看以下用例(仅示例):
解决方案本身很简单,发送请求,等待响应直到超时,如果收到响应返回,否则返回异常。
从设计的角度来看,它是相当复杂的。假设“最多一次”的处理方式,一般设计将是将请求发布到队列,从主题读回响应。在 Hazelcast 中,它需要一个 IQueue(考虑到缩放不是一个因素)和一个 ITopic。在 Kafka 中,可以通过一个主题、两个分区和消费者组 ID 来完成。此外,可以通过向主题/分区添加或删除其他使用者来启用或禁用日志记录。
以上只是说明如何实现异步通信的示例,Hazelcast 和 Kafka(以及 JMS/Camel 等)都有自己的一套灵活性。因此,特定基础架构的选择在很大程度上取决于您的通信设计。