以一个故事的角度展开RocketMQ
- RocketMQ
- 时间:2022-11-09 11:09
- 4338人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
1 什么是消息队列
来,讲个故事:
一位进京赶考的人儿,在一个渡口准备上船,父母送他到渡口,看着他上船,走远,直到消失在视野,但是没有得到孩儿安全到达的消息他们是不会走的,等了好久好久,船夫回来了,告诉他们他们的孩子安全到达了,他们满意的走了。
某一天,来了100位进京赶考的人儿,都急着上船,乱做一团,结果船翻了,更乱了。
但是,有一位高人,给码头建了一座房子,雇了一帮工作人员。房子还有好几层多少人都能装下。
不管来码头的有多少人,都由工作人员安排先坐到房子里指定的地方,排队等候,然后由指定的船来送走。有了房子里的工作人员,送孩子的父母也不用等了,等到船夫回来了,工作人员会去找到他们,告诉他们他们的孩子安全抵达了。
类比一下,这里的小房子就好比一个消息队列,乘船的人就是要发送的消息,然后送考生的父母就是生产者,船夫就是消费者。
消息队列(Message Queue)是一种消息队列服务中间件,提供一套完整的信息生产,传递,消费的软件系统。
但消息队列的功能远不止于队列,其本质是两个进程传递消息的一种手段,两个进程可以在一个机器上,也可以在不同的机器上。
2 为什么需要消息队列
2.1 削峰填谷
接上边的故事。
若是没有小房子,当某一天人突然很多的时候,船翻了,人乱了。
可是当人很多的时候,这个小房子就起到了至关重要的作用,安排大家到指定位置坐好,船还是一趟趟定时拉,不会乱,更不会翻船。
业务系统在超高的并发请求中,由于后端服务来不及处理如此多的请求,可能导致请求堵塞,甚至服务宕机。 这时候,消息队列的作用就很明显了。将消息收集起来,由消费者按照一定的频率进行消费,不会堵塞后端服务更不会宕机。
2.2 程序间解耦
若是没有这个小房子,家里人送赶考的人来了之后,还要和撑船的师傅交代,路上小心之类的。撑船的师傅上路后,还要回头说回去吧,别送啦。师傅知道谁的孩子,送到哪。家人知道谁撑的船,去哪。改天换个师傅撑船,还要重新叮嘱。
可是当有了小房子之后,来送孩子的父母不会知道孩子上的哪趟船,也不需要知道,只晓得孩子要去哪,要去做什么。撑船的是师傅也不知道谁家的孩子,只是知道孩子要去哪,做什么。家人只需要把孩子送到这个小房子里,告诉工作人员去哪,工作人员和撑船的师傅就将孩子送到。各司其职。
当开发不同的服务时,总是要考虑到彼此的依赖性,若是依赖性过强,则一个服务受影响之后,影响范围较大。当使用消息队列之后,服务间解耦,上下游系统之间互不依赖,更新升级完全不受影响。
2.3 异步处理
没有小房子之前,送孩子的家人要在渡口等待安全到达的消息。
有了房子和工作人员,来送孩子的父母不用在渡口等了,等工作人员通知即可。
当处理一些耗时的操作的时候,若是同步等待请求返回结果,会耗费很多的时间在等待请求返回上。可以通过消息队列只将接收消息成功返回给用户,然后异步处理这些耗时的操作。
2.4 数据的最终一致性
没有小房子之前,送孩子到渡口了,没船,又回去了,再来,没船,又回去了,船夫来了。没人,等了好久又走了。
然而有了小房子之后,坐船的人来了,没船就在小房子里等,这房子,冬暖夏凉,有吃有喝,等到船夫来了,将他们送走,也就意味着只要到了这个小房子,就由这个小房子保证一定可以送达的。
两个系统间通信的时候,不会因为某一个系统宕机或者拥堵导致消息发送失败,当宕机的服务重启之后,可以继续消费消息。达到最终一致性。
作者:奔跑的毛球
链接:https://juejin.cn/post/7125408515060924430
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
下一篇: 匿名内部类方式实现线程的创建