并发一上来,服务器又挂了?肿么办?
引言:
最近有童鞋在后台留言,建议写个消息队列系列。经历过后端高并发场景的童鞋,肯定知道消息队列的香,管它多少并发量,有了消息队列,我就能控制上限,hold 住全场!!
其实写前端的同学,也会接触到消息队列,js的事件就是基于浏览器的事件消息队列实现的,虽然 js 是单线程语言,但是浏览器内核一般都是C++写的,浏览器内部会有线程去轮询所有事件的队列,逐个执行。
什么叫消息队列
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
为何用消息队列
从上面的描述中可以看出消息队列是一种应用间的异步协作机制,那什么时候需要使用 MQ 呢?
以常见的订单系统为例,用户点击【下单】按钮之后的业务逻辑可能包括:扣减库存、生成相应单据、发红包、发短信通知。在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单量增长,需要提升系统服务的性能,这时可以将一些不需要立即生效的操作拆分出来异步执行,比如发放红包、发短信通知等。这种场景下就可以用 MQ ,在下单的主流程(比如扣减库存、生成相应单据)完成之后发送一条消息到 MQ 让主流程快速完结,而由另外的单独线程拉取MQ的消息(或者由 MQ 推送消息),当发现 MQ 中有发红包或发短信之类的消息时,执行相应的业务逻辑。
以上是用于业务解耦的情况,其它常见场景包括最终一致性、广播、错峰流控等等。
常见的消息队列有哪些?
比如老牌的 ActiveMQ、RabbitMQ ,最近一段时间比较火的Kafka ,还有ZeroMQ ,阿里巴巴出品的RocketMQ,现在已经成为 Apache项目,连 redis 这样的 NoSQL 数据库也支持 MQ 功能。消息队列的实现原理其实都差不多,只是侧重点不太一样,比如kafaka 用在日志推送上比较多,像RabbitMQ,RocketMQ侧重于业务事件上比较多,比如京东购物,美团外卖下单的订单系统等
接下来我们重点讲一下RabbitMQ,只要你会了一种,其它触类旁通
梳理一下知识点,大纲如下:
(一) RabbitMQ是什么?它有什么特点
(二) RabbitMQ的安装和管理
(三) JAVA实现RabbitMQ客户端
(四) RabbitMQ的消息类型的种类和使用场景和实现
(五) RabbitMQ集群
欢迎拍砖!!
- 扫码关注“火龙果编程”公众号,早日成为编程大神
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。