同学们应该都会被问到过这个问题:你的系统为什么要用消息队列?
大家普遍回答:我入职前,系统里面就已经用了消息队列啊,然后就用了。
其实面试官就是想看看你有没有深入了解过消息队列,有没有认真思考过消息队列解决了哪些问题?
这篇文章主要带大家解决以下几个问题:
一、为什么要用消息队列
场景1.
假设现在有A,B 两个系统,都需要推送数据到C系统,普遍做法是C提供给一个接口,给A,B调用;
如果这时又上来了一个系统D,也需要A,B将数据推送给它,于是A,B又得调用D提供的接口,这样不太利于后期扩展。
场景2.
假设有一个商城系统,有一天做了一个促销活动,导致当天流量暴增,但是通过监控发现,用户进入首页,调用首页接口耗时非常长,导致有很多用户进入首页后,很长一段时都是空白页,最后发现是由于用户在调用首页接口后,后台需要更新用户的日活信息,直接操作了数据库,当时由于用户量又多,才导致耗时进一步变长,后面临时采用线程异步更新用户日活信息到数据库。
其实上面两个场景都可以用消息队列的基本特性去解决:
- 异步处理
- 应用解耦
所以为什么要用消息队列,我们就很清楚了,使用消息队列能让我们系统更加稳定,更加容易扩展,而不是为了用而用,而不考虑使用消息队列能够给我带来什么好处,只是盲目的去使用。
二、我的项目适合使用哪种消息队列
上面说了为什么使用消息队列,接下来在分享下几种主流的消息中间件分别适合在什么场景(项目)下去使用:
RabbitMQ
rabbitmq是erlang语言开发的,因为erlang本身就具备高并发的优势,所以性能非常好;但是不利于二次开发;社区活跃度非常高,一般开发过程中遇到的问题都能在社区找到答案。
如果公司的数据量不是特别大或者小公司优先选择rabbitmq
Kafka
kafka天生就是为了日志而生的,由于其顺序读写磁盘,所以其吞吐量极高。
kafka一般可以结合elk 去使用;一般不建议小公司使用,需要部署太多节点了,大公司请随意。
RocketMq
rocketmq 主要为金融和电商行业而生,rocketmq融入了kafka的一些设计思想;
由于它扛过了多次双11,所以它的稳定性和高可用性是毋庸置疑的;
而且rocketmq中加入了延时队列,很适用于订单超时未支付自动取消的功能需求。
三、使用消息队列会带来什么问题
我们在上面说了项目中引入消息队列带来的好处,但是同样也会给我们的项目带来一些不可避免的问题:
- 系统可用性降低
- 系统复杂性提高
- 数据一致性问题
公众号“AI码师”