本系列主要讲解kafka基本设计和原理分析,分如下内容:
消息模型
JMS协议(ActiveMQ)
Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)。
JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。
点对点:
消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。这里要注意:
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
生产者发送一条消息到queue,只有一个消费者能收到。
发布/订阅
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
发布者发送到topic的消息,订阅了topic的所有订阅者都会收到消息。
AQMP协议(RabbitMQ)
RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。此外RabbitMQ是向消费端推送消息,订阅关系和消费状态保存在服务端。
点对点
生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。
发布/订阅
当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费此消息。
RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。所以支持多订阅时,消息会多个拷贝。
kafka
kafka没有实现JMS协议,但其消费组可以像点对点模型一样让消息被一组进程处理,同时也可以像发布/订阅模式一样,让你发送广播消息到多个消费组。
点对点
当多个消费者同属一个消费组时,对应消息会被同消费组的当个消费组消费使用,类似点对点的消息模型。
即消息Message1只会被消费组GroupA中的Consumer_1、Consumer_2、Consumer_3消费
发布/订阅
当每个消费者都属于不同的消费组时,对应的消息会被每个消费者消费使用,类似订阅/发布的消息模型。
共同学习,写下你的评论
评论加载中...
作者其他优质文章