学习背景:
公司最近打算将之前的项目改造成分布式的。但我觉得是个坑。。。 简单来说就是将之前的单体应用(应用程序、数据库)部署多套在不同的地市上。应用给统一的入口,相互之间的数据同步在应用层面进行同步。(其实数据库层面同步比较不坑,那样的话就不用从繁杂的业务里把数据的操作挑出来进行同步了。)。应用层面进行消息同步,所以选择了kafka这个消息中间件。于是就开始了kafka的学习之路。
1、 消息队列(Message Queue)
kafka是消息队列中的一种。所以,介绍kafka之前先简单的说下现在比较流行的几个消息队列吧
Message Queue消息传送系统提供传送服务。消息传送依赖于大量支持组件,这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消息服务器可以使用一个或多个代理实例。
JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
1.1 消息队列分类
消息队列分类:点对点和发布/订阅两种:
1、点对点:
消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
2、发布/订阅:
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
1.2 消息队列对比
1、
RabbitMQ:支持的协议多,非常重量级消息队列,对路由(Routing),负载均衡(Loadbalance)或者数据持久化都有很好的支持。
2、 ZeroMQ:号称最快的消息队列系统,尤其针对大吞吐量的需求场景,擅长的高级/复杂的队列,但是技术也复杂,并且只提供非持久性的