队列:
传统的串行化服务的缺点是
1、耦合性太强,(如果发生网络波荡,就会导致都失败)
2系统吞吐量不大,耗时多
传统的串行化服务的优点是:
系统结构简单,排查错误比较方便。
消息队列
消息只需要发送到消息队列上,成功就会返回成功,不用考虑后面的操作,之后的操作都是异步的操作
优点:解耦,提高性能
缺点:分布式事务解决方案
以一个淘宝订单的简单系统流程来展示,两者的区别:
事务:
只要涉及到消息队列,肯定是要处理事务问题,
事务:具有原子性,所有的动作要么都执行,要么都不执行
2、如何解决重复通知,一个服务订阅多个队列的问题:使用分布式锁
3、socket用于即时通讯。socket是长连接。
传统的http请求,随着服务端的返回给客户端消息,两者之间的关联就消失了,所以服务端想要主动联系客户端就得考轮询的方式,但是这种轮询比较耗费性能的,既要消耗客户端性能,又消耗服务器资源,于是有了长连接的概念。
服务端想要直接访问客户端:要通过轮询的方式
MQ的两种流派:
1、broker是一个中转站,为了将消息放到不同的队列里。
(1)消息来了主动进入放(2)等待消息请求
重topic
必须有topic,
kafka:全球消息处理性能最快的一款mq
rocket mq:阿里内部的一个大神根据kafka手写的,性能稍逊于kafka,但功能比kafka多
轻topic
可以没有topic,topic只是一种中转模式
rabbitmq
2、无broker
zeromq没有使用broker,直接使用socket长连接
经典的消息队列堆积问题解决方案:
(1)增加消费者
(2)限流,先过滤掉一部分请求