消息队列的学习(一)
(消息队列概念以及应用场景)
-
1.消息协议的概念:发送者发送消息,接收者接受消息,这两种行为的大前提是消息按照某一种格式构成,没有格式的消息是没有意义的,这种构造消息的格式就是消息协议。
-
2.消息发送的过程:
a.即时通信:类似QQ,微信。发送者发送消息,接受者立即就可以收到,并且提示。
具体的实现方式是RPC。
b. 延迟通信:发送者发送消息,消息到达某一个容器,等这个消息满足容器的某一种条件时,容器发送这个消息到接收者。
容器的一种实现方式就是消息队列。 -
3.消息队列的使用场景:
3.1 异步处理:
场景举例:注册账号,注册之后,系统会给注册人的邮箱发送邮件,给注册人的手机发送短信。
传统方式:
a.串行处理:注册成功 > 发送邮箱 > 发送短信 > 处理结果返回客户端。
b.并行方式:注册成功 > 发送邮箱,同时发送短信 > 处理结果返回客户端。
假如 注册需要50ms(毫秒), 发送邮箱50ms,发送短信50ms。那么串行处理需要150ms。并行处理需要100ms。
使用消息队列改进:注册成功 > 发送邮箱,发送短信动作写入消息队列 > 返回结果。
写入消息队列的动作几乎是瞬间完成的,速度很快,几乎是0ms。那么改造之后,完成整个业务的时间是50ms。效率大大提升。3.2. 应用解耦:
场景举例:电子商城,订单系统,和库存系统。客户下单之后,请求库存系统,减少库存,返回下单成功。
传统方式:客户下单 > 请求库存 > 返回结果。
缺点:如果库存系统瘫痪了,那么下单就失败。会影响交易收益。
使用消息队列该进: -
订单系统:客户下单 > 持久化处理 > 库存请求写入消息队列 > 下单成功
-
库存系统:订阅下单的消息 > 采用拉/推的方式,获取下单信息 > 库存操作
这样即使库存系统瘫痪了,也不影响正常的下单,避免了损失。3.3 流量削锋:
场景举例:秒杀活动 团抢活动
前端引用消息队列,秒杀请求写入队列,设置队列长度,超过长度的请求转入错误页面。3.4 日志处理
解决大量日志的传输问题。架构如下: -
日志采集客户端:采集日志,定时写入kafka队列。
-
kafka队列:负责日志的接受,存储,转发。
-
日志处理应用:订阅并且消费kafaka队列的数据。
kafka日志处理应用案例:新浪技术分享:我们如何扛下32亿条实时日志的分析处理(1)Kafka:接收用户日志的消息队列。
(2)Logstash:做日志解析,统一成JSON输出给Elasticsearch。
(3)Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。
(4)Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因。
3.5消息通讯
- 点对点通信:客户端A和客户端B使用同一个消息队列,就可以进行点对点的通信。
- 聊天室通信:客户端A和客户端B。。。。客户端N订阅同一主题,进行消息发布和接受。
-
4.消息模式
4.1 P2P模式:P2P模式包含3个角色:发送者,消息队列,接收者。发送者发送消息到特定的消息队列,消息队列保存消息,直到消息被消费或者超时。
特点:只有一个接收者。接收者接收消息会向队列做应答。
如果希望每一个消息都被消费,就应该是用P2P模式。4.2 Pub/Sub模式:包含3个角色:主题,发布者,订阅者。
特点:每个消息可以被多个订阅者消费。针对某一个主题,必须创建消费者对象,才能消费发布者的消息。为了消费消息,订阅者必须保持运行状态。其实JMS允许订阅者持久化一个订阅者,即使订阅者不在运行状态,也可以消费消息。
如果希望消息可以被多个消费者接收,并且不需要返回结果的话,使用pub/sub模式。