免责声明。我有Hazelcast和Vert.x.我是Apache Kafka的新手。抱歉,如果我的问题看起来先入为主,那不是。
有两种广泛的方法来安排微服务之间的沟通:休息和消息传递。在我的地区,当有人说他们正在使用消息传递在微服务之间进行通信时,事实上,这意味着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*/);
另外还有vert.x(非常夸张的演员框架(写在Hazelcast的主题和会员发现之上。
KAFKA消息传递更适合在微服务之间进行通信?
这是有点通用的问题,我不是Kafka专家;但是我将尝试讲述Hazelcast的消息传递功能。
Hazelcast包含两种类型的主题;一个是常规的ITopic
,另一个是可靠的主题,它再次实现ITopic
接口。用法大多是相同的,但是它们在保证方面有所不同。常规ITopic
基于Hazelcast的事件机制,并且不能保证消息传递。可靠的主题由Ringbuffer
备份,并且事件不会丢失,因为RingBuffer默认情况下使用一个同步备份配置。另外,每个可靠的ITopic
都会有自己的戒指;如果一个主题的生产者非常快,它不会导致以较慢的节奏运行的主题问题。最后,由于常规ITopic
背后的事件系统与其他数据结构共享,例如收集侦听器,因此您可以遇到隔离问题。可靠的ITopic
不会发生这种情况。但是由于所有这些缺点,普通的ITopic
可以运行速度更快,因为它使用了Fire&amp"忘记事件机构。
apache kafka拥有自己的巨大优势;例如,它们都是作为带有时间持续日志的消息流平台构建的,因此可以将数据存储到磁盘上以进行故障耐受性。
总而言之,如果您需要消息持久性,并具有在应用程序上发送消息所需的所有功能,请与Kafka一起使用,因为它更专业。但是,如果您需要一个内存数据平台,包括支持消息传递,请使用Hazelcast。
卡夫卡的消息传递模型/通信与可用的其他主流消息基础结构明显不同。虽然大多数消息在主题和队列之间都明确区分了,但kafka却严格却没有。它的主题可以作为主题以及队列,在Hazelcast中不可用。
现在。从微服务设计的角度来看,就设计选项而言,这可能会产生很大的不同。任何利用消息传递的微服务本质上都是在异步通道上的明显同步通信,作为示例NGINX模型。
从该角度来看以下用例(仅示例(:
- 水平部署了5个tomcats,其中2个Web应用程序本质上是较大系统的子系统
- 他们每个人都必须在没有任何其他依赖性(数据交换协议在外部定义( 的情况下进行交换数据(仅根据要求读(
- 需要选中子系统之间的所有相互作用
解决方案本身很简单,发送请求,等待响应直到超时,如果收到响应返回或返回以例外返回。
从设计的角度来看,这很复杂。假设"最多一次"的处理风格,一般设计将被发布到队列中,请从主题中阅读回复。在Hazelcast中,它需要一个iQueue(考虑缩放不是一个因素(和迭代。在Kafka中,可以使用一个主题,两个分区和消费者组ID来完成。此外,可以通过在主题/partiions中添加或删除其他消费者来启用或禁用记录。
以上只是一个例子,说明了如何实现异步通信,Hazelcast和Kafka(以及此事JMS/Camel等(都有自己的一套灵活性。因此,选择特定的基础架构将在很大程度上取决于您的通信设计。