分布式-MQ比较

1 作用

应用耦合、异步消息、流量削峰

2 应用场景

异步处理

场景: 用户注册以后需要发送注册邮件和短信。
串行方式: 注册完成-》发送邮件-》发送短信-》返回
并行方式: 注册完成之后,发送邮件的同时发送短信-》返回
消息队列: 注册完成,将信息写入消息队列,然后返回。邮件和短信的发送异步进行处理。

应用解耦

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

劣势:加入库存系统无法访问,库存扣减失败,导致订单失败。  

引入MQ:
订单系统:用户下单完成,订单系统进行持久化处理。将消息写入MQ,返回用户下单成功。
库存系统:订阅下单的消息队列,采用pull/push的方式,获取下单信息,进行库存操作。

即便是库存系统不能正常使用,也不影响正常下单。因为订单系统将消息写入MQ后,不再关心后续操作,实现了解耦

流量削峰

场景: 秒杀活动

在应用前端加入消息队列,控制参加活动的人数。从而缓解短时间内高流量压垮应用。  
用户请求,传递到服务器后,首先写入消息队列,加入消息队列的长度超过最大数量,则直接抛弃该请求,并跳转至错误页面。  
秒杀业务再根据消息队列中的请求信息做后续处理。

日志处理

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

KAFKA: 接收用户日志的消息队列。  
LOGSTASH: 做日志解析,统一成json输出给Elasticsearch.   
Elasticsearch: 实时日志分析服务的核心技术,schemaless实时的数据存储服务,通过index组织数据,检举强大的搜索和统计功能  
Kibana:  基于Elasticsearch的数据可视化组件  

消息通讯

消息队列都会内置高效的通信机制。

点对点

客户端A、B使用同一消息队列,进行消息通讯。

多对对

多个客户端同时订阅同一主题,进行消息的接收和发布。实现聊天室效果。

RabbitMQ常用概念

Borker: 消息队列的服务器实体。
Exchange: 消息交换机。指定消息按照什么规则,路由到那个队列。
QUEQUE: 消息队列的载体。每个消息都可以投入到一个或多个队列
Binding: 绑定exchange和queue按照路由规则绑定起来
Routing Key: 路由关键字,exchange根据消息的这个关键字进行投递
vhost: 虚拟主机,一个broker中可以有多个vhost,作用于不同用户的权限分离
producer: 消息生产者,投递消息的程序
consumer: 消息消费者,接收消息的程序
channel: 消息通道,在客户端的每个链接,可以创建多个channel,每个channel代表一个会话任务

使用过程

客户端链接到消息服务器broker,打开一个channel.
客户端声明一个exchange,并设置相关属性。
客户端声明一个queue,并设置相关属性。
客户端使用routing key,在exchange和queue之间建立好绑定关系
客户端投递消息到exchange。
exchange接收到消息之后,根据消息的key和已经设置好的binding关系,进行消息的路由和投递。

Kafka相関概念

Broker:kafka集群包含一个或多个服务器,这种服务器就是broker
topic:每条发送到kafka集群的消息都有一个类别。物理上不同的topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker,但只需要指定消息的topic,即可生产和消费数据,无需关心数据存储位置。
Partition:partition物理上的概念,每个topic都包含多个partition.
producer: 消息生产者,负责发布消息到kafka broker
consumer: 消息消费者,从kafka broker读取消息进行处理
consumer group: 每个consumer都属于一个特定的consumer group,可为每一个consumer都指定,如不指定,则属于默认的group

你可能感兴趣的:(分布式)