队列
解决什么问题
很多场景下、我们没必要保证强一致性、只需要保证最终一致性即可、
eg. 不用所有的结果都实时反馈给用户、不是所有的请求都必须一次性处理成功、不用所有的依赖方都处理完毕
此时、可以考虑使用消息队列
但要保证消息处理的有序性、及重复消费的幂等性、
常见场景
1. 异步处理: 使用队列的一个主要原因是异步处理、
eg. 在用户注册成功后、需要发送注册邮件/新用户积分/优惠券等、缓存过期时、先返回过期数据、然后异步更新缓存、异步写日志等
通过异步处理可以提升主流程响应速度、非主流程可以集中处理、还可以将任务聚合批量处理
2. 系统解耦: eg. 用户支付成功后、需要通知生产配送系统、发票系统、库存系统、推荐系统、
搜索系统等进行业务处理,而未来需要支持哪些业务是不知道的、并且这些业务不需要实时处理、不需要强一致性、只需要保证最终一致性即可、所以、可以通过消息队列来解耦
3. 数据同步: eg. 想把MySQL的变更同步到redis、或者mongodb、或者让机房之间的数据同步、
或者主从同步等、可以考虑使用databus、canal、otter等、使用数据总线队列可以保证数据修改的有序性
4. 流量削峰: 系统瓶颈一般在db上、比如 扣减库存、下单等、此时可以考虑将请求暂时放入队列、
通过缓存+队列的方式将db流量进行削峰
同样、对于秒杀系统、下单服务会是改系统的瓶颈、此时可以使用消息队列进行排队和限流、
从而保证下单服务