消息队列中间件是分布式系统基础架构中必不可少的一个组件,主要用来解决应用解耦,异步消息,流量削峰、日志处理和消息通讯等问题,实现高可用,高性能,可伸缩和最终一致性架构。使用较多的消息队列ActiveMQ、RabbitMQ、Kafka等。
异步消息:常用场景就是用户在网站注册成功时,需要发送短信和邮件,这种需求就可以在注册信息插入数据库成功后,将发送任务写入消息队列,同时将结果返回给用户,降低系统的业务响应时间、提升用户的体验度。
应用解耦:例如在一个电商系统中,用户下单之后,订单系统需要调用库存系统进行减库存操作,如果此时库存系统不可用,那么会导致订单系统下单失败,从而影响系统的业务响应能力和用户的体验度,这时候如果引入消息队列,在订单系统生成订单之后,将减库存的任务写入消息队列,即使此时库存系统不可用,也不会丢失消息,保证订单系统能够正常处理下单,实现订单系统和库存系统的应用解耦。
流量削峰:在电商系统中,秒杀和抢购业务常常有这种需求,为了防止瞬间高并发,高流量导致压垮应用,在系统服务器处理请求之前需要引入消息队列,在用户发送请求时,先将任务写入消息队列,加入消息队列长度超过定义的最大数值,则直接抛弃用户请求或者跳转到错误页面。对于写成功的消息,业务服务器在进行后续处理。
日志处理:现在好多公司的大数据处理中心都会针对于各个业务系统的日志进行分析,从而展示各种各样的统计结果,为上层的决策提供支持。kafka就是这类需求中最常用的消息队列中间件,日志采集客户端,将采集来的数据写入kafka;kafka负责将日志数据进行存储和转发;订阅kafka队列的日志处理应用在收到日志数据时,进行一系列的逻辑处理,而后通过可视化工具进行图表生成,最常用的就是ELK。
消息通讯:类似于QQ和微信,消息队列中常用模式就是点对点通讯和发布订阅模式;点对点,最常用的场景就是1对1聊天,而发布/订阅则类似于聊天室,微信公众号的订阅等。