会出现什么情况呢?
1, 为了这个女朋友, 我请假回去拿(老板不批).
2, 小哥一直在你楼下等(小哥还有其他的快递要送).
3, 周末再送(显然等不及).
4, 这个女朋友我不要了(绝对不可能)!
在上面例子中,"快递小哥" 和 "买女朋友的我" 就是需要交互的两个系统, 小芳便利店就是我们本文要讲的 -"消息中间件". 总结下来小芳便利店 (消息中间件) 出现后有如下好处:
1, 解耦
快递小哥手上有很多快递需要送, 他每次都需要先电话一一确认收货人是否有空, 哪个时间段有空, 然后再确定好送货的方案. 这样完全依赖收货人了! 如果快递一多, 快递小哥估计的忙疯了...... 如果有了便利店, 快递小哥只需要将同一个小区的快递放在同一个便利店, 然后通知收货人来取货就可以了, 这时候快递小哥和收货人就实现了解耦!
2, 异步
快递小哥打电话给我后需要一直在你楼下等着, 直到我拿走你的快递他才能去送其他人的. 快递小哥将快递放在小芳便利店后, 又可以干其他的活儿去了, 不需要等待你到来而一直处于等待状态. 提高了工作的效率.
3, 削峰
假设双十一我买了不同店里的各种商品, 而恰巧这些店发货的快递都不一样, 有中通, 圆通, 申通, 各种通等...... 更巧的是他们都同时到货了! 中通的小哥打来电话叫我去北门取快递, 圆通小哥叫我去南门, 申通小哥叫我去东门. 我一时手忙脚乱......
我们能看到在系统需要交互的场景中, 使用消息队列中间件真的是好处多多, 基于这种思路, 就有了丰巢, 菜鸟驿站等比小芳便利店更专业的 "中间件" 了.
最后, 上面的故事纯属虚构......
消息队列通信的模式
通过上面的例子我们引出了消息中间件, 并且介绍了消息队列出现后的好处, 这里就需要介绍消息队列通信的两种模式了:
一, 点对点模式
如上图所示, 点对点模式通常是基于拉取或者轮询的消息传送模型, 这个模型的特点是发送到队列的消息被一个且只有一个消费者进行处理. 生产者将消息放入消息队列后, 由消费者主动的去拉取消息进行消费.
点对点模型的的优点是消费者拉取消息的频率可以由自己控制.
但是消息队列是否有消息需要消费, 在消费者端无法感知, 所以在消费者端需要额外的线程去监控.
二, 发布订阅模式
如上图所示, 发布订阅模式是一个基于消息送的消息传送模型, 改模型可以有多种不同的订阅者.
生产者将消息放入消息队列后, 队列会将消息推送给订阅过该类消息的消费者(类似微信公众号).
由于是消费者被动接收推送, 所以无需感知消息队列是否有待消费的消息!
但是 consumer1,consumer2,consumer3 由于机器性能不一样, 所以处理消息的能力也会不一样, 但消息队列却无法感知消费者消费的速度! 所以推送的速度成了发布订阅模模式的一个问题! 假设三个消费者处理速度分别是 8M/s,5M/s,2M/s, 如果队列推送的速度为 5M/s, 则 consumer3 无法承受! 如果队列推送的速度为 2M/s, 则 consumer1,consumer2 会出现资源的极大浪费!
Kafka
上面简单的介绍了为什么需要消息队列以及消息队列通信的两种模式, 接下来就到了我们本文的主角 --kafka 闪亮登场的时候了!
Kafka 是一种高吞吐量的分布式发布订阅消息系统, 它可以处理消费者规模的网站中的所有动作流数据, 具有高性能, 持久化, 多副本备份, 横向扩展能力......... 一些基本的介绍这里就不展开了, 网上有太多关于这些的介绍了, 读者可以自行百度一下!
来源: http://www.bubuko.com/infodetail-3479627.html