消息队列场景:异步处理,应用解耦,流量削锋,日志处理,消息通讯

①异步处理:
场景:用户进行注册,需要发送邮件和发送短信。传统的处理方式:1.串行 2.并行

1.串行: 将注册信息写入数据库成功后,发送注册邮件,再发送注册短信,以上三个步骤全部完成,才会返回给客户端。

JAVA消息队列批量同步 java消息队列应用场景_客户端

2.并行: 将注册消息写入到数据库成功后,发送注册邮件的同时也发送注册短信。三个任务完成后,再返回给客户端。与串行相比,减少了后面发送两步的处理时间。

JAVA消息队列批量同步 java消息队列应用场景_消息队列_02

不考虑其他因素:
如图所示:串行处理时间花费了150ms,并行处理时间花费了100ms。

在引入消息队列后,将不是必须的业务逻辑,进行异步处理。

JAVA消息队列批量同步 java消息队列应用场景_客户端_03

②应用解耦:

场景:用户下单后,订单系统需要通知库存系统。传统做法:订单系统调用库存系统的接口。

JAVA消息队列批量同步 java消息队列应用场景_java消息队列中间件_04


缺点:

  • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。
  • 订单系统和库存系统耦合。

利用消息队列来处理上述问题:

JAVA消息队列批量同步 java消息队列应用场景_客户端_05

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列, 返回用户订单下单成功。
  • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
  • 假如:在下单时库存系统不能正常使用,也不影响正常下单,因为下单后,订单系统写入消息队列就不再关系后续其他操作了。实现订单系统与库存系统的应用耦合。

③流量削锋:
流量削锋一般在秒杀活动或者团抢活动出来容易出现 。
场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

  • 可以控制活动的人数
  • 可以缓解短时间内高流量压垮应用

JAVA消息队列批量同步 java消息队列应用场景_日志处理_06

  • 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误界面。
  • 秒杀业务根据消息队列中的请求信息,再做后续处理。

④日志处理:

日志处理是指将消息队列用于日志处理中,比如kafka的应用,解决大量日志传输的问题。

JAVA消息队列批量同步 java消息队列应用场景_消息队列_07

  • 日志采集客户端:负责采集日志数据,并定时买入kafka队列。
  • kafka消息队列:负责日志数据的接收、存储和转发。
  • 日志处理应用:订阅并消费kafka队列中的日志数据。

新浪kafka日志处理机制:

JAVA消息队列批量同步 java消息队列应用场景_java消息队列中间件_08

  • kafka:接收用户日志的消息队列。
  • logstash:做日志的解析,把日志解析成json格式给Elasticsearch。
  • Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。
  • Kibana:基于Elasticsearch的数据可视化组件,超强的数据能力是众多公司选择ELK stack的原因。

⑤消息通讯:
消息通讯是指一般消息队列都内置了高效的通信机制,因此也可以单纯的用来消息通讯。比如实现点对点消息队列,或者聊天室。

点对点通讯:

JAVA消息队列批量同步 java消息队列应用场景_日志处理_09


客户端A和客户端B使用同一个消息队列进行通信。聊天室通讯:

JAVA消息队列批量同步 java消息队列应用场景_客户端_10


客户端A,客户端B,,客户端N都订阅了同一个消息队列,用于消息的发布和接收,实现聊天室通讯。