从Kafka看Broker中间件的设计
1. 软件设计要求
满足以下功能:
- 消息模型
1. Req-Rep模型(http服务器)
2. Pub-Sub模型(消息队列)
+ push模式:多播/监听队列
+ pull模式:消息存储/序列化
3. Producer-Consumer模型(Broker缓存) - 线程关系
- 心跳机制
- 独立线程负责多路复用
- 数据的包装struct
- 消息路由
- topic_routing
使用Broker中间件的优势:
-
系统解耦
快递员跟收件人来打比方的话,快递员送货如果都送到每个人手里的话,那么快递员要一个个打电话,收件人收到电话之后,要在家等着快递。快递员跟收件人是紧密耦合在一起的。如果门口保安可以代收快递的话,快递员跟收件人就解耦了,快递员放在门口保安处,收件人去门口保安处领,就可以了,不用必须等着或者必须送到。这种就叫解耦
-
异步处理
还是上面的例子,快递员给收件人打电话,说马上送快递。收件人说不行,要去上班,你放门口老大爷那就行。就是说收件人不用等着送到才进行下一件事,这就叫做异步处理。
-
削峰限流
有一天你买的快递到了,你媳妇、你爸妈买的快递都到了,打电话都让你去取,他们分别在小区的东南西北门都有,半个小时不取的话,就走了。你这个时候会不会手忙脚乱。但是这会你跟他们说:都给我放在南门老大爷那边。这会就是快递员去放到那边,你可以慢慢的取了。这就是削峰限流的意思
这样,一条消息的流转路径就如下图所示,先走主题路由(topic),然后走分区路由(partition),最终决定这条消息该发往哪个分区。
- 生产消息
- 批量发送: 由于频繁发送的话,可能会比较占网络,可以在参数设置batch的方式进行发送
- 消息压缩
- 高效序列化
- 内存池复用
- 存储消息
- IO多路复用