为什么使用消息队列
解耦
譬如签到送积分, 签到和送积分是两个操作. 签到产生了很重要的数据, 它可以把该消息发送到MQ. 然后积分系统需要该数据, 从MQ中直接获取即可. 这样签到系统就做到了和积分系统解耦. 不必担心积分系统挂了怎么办, 是不是需要重试等. 这些都可以在积分系统内部自己实现. 再者, 如果以后另外一套系统也需要该签到数据, 直接从MQ中获取即可, 实际上与签到系统已无关系.
异步
当做到解耦后, 实际异步就是自然而然的事情. 如果签到只需要1ms, 而送积分, 或者其他操作需要500ms, 那不可能等所有操作完成之后再去返回数据给用户. 这样就做到了异步.
削峰
削峰是指当并发访问高峰期, 通过MQ达到限流的目的, 从而减少对数据库MySQL的压力.
消息队列有什么优点和缺点
优点就是第一点所提到的解耦, 异步, 削峰
缺点:
- 系统可用性降低(当然有办法保证高可用), 相对而言
- 系统复杂度提高(这是引入新技术之后的必然结果), 因为随之而来的问题就是该技术本身的问题: 如何保证消息没有重复消费, 如何保证消息不丢失, 如何保证消息的顺序性等等
- 数据一致性问题(也可以归为系统复杂度提高的问题), 可以解决
- 如何保证消息的高可用
- 消息传递路径更长, 延时会增加
- 上游无法知道下游的执行结果(很致命)
MQ适合使用的场景
- 数据驱动的任务依赖. 如晚上执行的定时任务, task1, task2, task3, task2依赖task1, task3依赖task2
- 上游不关心执行结果