消息中间件简介

分布式架构三大剑客:消息中间件、缓存中间件、RPC调用机制

消息中间件

消息中间件能做什么?

  • 异步:将系统串行任务异步化
  • 解耦:将系统解耦
  • 销峰:通过消息队列的队列长度限制同时来临的订单数量,减少大流量对系统的冲击,实现销峰限流。取决于流量大小,流量大选择kafka或RocketMQ,流量适中选择RabbitMQ
  • 跨系统数据传递(通讯):实现RPC进行通讯,实际上不会用MQ实现通讯,而是使用Netty
  • 海量数据同步方案:首先kafka,一般用于log日志传输,类似mysql的binlog数据同步
  • 任务调度:通过mq的延迟队列实现,首先RabbitMQ
  • 分布式事务之最终一致性:RabbitMQ本身不支持事务消息,但是利用其特性confirm + ack机制可以实现分布式事务;RocketMQ本身支持事务消息。
  • 事件驱动编程:时效性要求低的可以使用定时任务,时效性高的就可以使用消息中间件
  • 高内聚低耦合
  • 顺序保证
  • 可靠传递

消息中间件的本质?

  • 一种具备接收请求、保存数据、发送数据等功能的网络应用
  • 和一般网络应用的区别是它只负责数据的接收和传递,所以性能高于普通程序。

消息中间件核心组成?

  • 协议:程序通过什么协议与消息中间件沟通
  • 持久化:什么技术支持MQ消息持久化存储
  • 消息分发:MQ收到消息后,怎么处理,如何发给其他人,如果发送失败,是否重试?
  • 高可用:保证消息中间件可用、不当机,通过集群部署保证高可用
  • 高可靠:消息发送成功,通过重试保证高可靠

消息中间件常用协议:

  • OpenWire(很少用):路由器会使用此协议。
  • AMQP:标准的协议。RabbitMQ使用此协议。
  • MQTT:车载系统监控使用此协议。轻量、结构简单、传输快、没有事务、无持久化设计。适用于计算能力有限,低带宽,网络不稳定的场景。
  • Kafka:基于TCP的二进制协议,消息内部通过长度来分割。结构简单、解析快、无事务设计,有持久化设计。Kafka使用此协议。
  • OpenMessage:阿里开发的。结构简单,解析快,有事务设计,有持久化设计。RocketMQ使用此协议。

消息中间件为什么不用Http作为协议?

  • Http中有header和cookie,太笨重,性能不高
  • Http一次请求一次响应

 消息中间件分发策略

高可用

规定的条件和时间内处于可执行可用状态,当业务量大时,一台消息中间件服务器可能无法满足需求,这时需要集群部署,来达到高可用目的。

Master-Slave主从共享数据部署方式

主从共享数据,但是客户端只能通过主节点获取数据。当master节点挂掉,会切换到slave节点,将slave节点转换成master节点。

mysql、redis、mongodb也使用的此种部署方式。

Broker-Cluster多主集群同步部署方式

集群分片部署,不同的节点部署存储不同的数据,但是客户端可以从所有的节点上读取数据。

Master-Slave与Broker-Cluster结合

客户端调用负载均衡服务器,返回对应master节点的IP和port,然后客户端发送消息给master节点,master节点将消息同步到对应的slave节点,从而保证主从节点数据一致。

高可靠

        系统无故障地持续运行,从来不崩溃、不报错,或者崩溃、报错几率很低。

        消息传输可靠:通过协议来保证系统间数据解析的正确性。

        消息存储可靠:通过持久化来保证消息的存储可靠性。

分布式系统:

    将一个系统按照业务模块拆分(拆分原则)为多个独立的子系统

    优点:

  • 业务模块相互独立,某一个业务模块升级,不用升级整个系统
  • 开发方便,不需要代码合并
  • 如果某个业务模块压力大,只需要对该业务模块单独进行水平扩展(集群部署),其他业务模块不收影响,可以充分合理利用资源

    缺点:

  • 系统之间交互变得复杂,需要RPC/rest/MQ来实现相互调用
  • 当一个业务特别大时,可能会出现业务系统崩溃的问题,可以通过自动化水平扩容解决这个问题

消息中间件带来的风险?

  • 系统可用性风险:为了解决MQ挂掉带来的可用性风险,需要考虑高可用,使用集群部署
  • 系统复杂度提高:
  • 数据一致性保证:将串行任务解耦成异步任务,有可能某个子任务执行失败导致结果不一致

常用的消息中间件

  • ActiveMQ:处理能力最低,老牌的基于Java JMS规范来设计的
  • RabbitMQ:如果系统没有高并发高性能要求,首选RabbitMQ。RabbitMQ是用Er lang语言实现AMQP(Advanced Message Queue Protocol)协议的消息中间件,支持多语言。
  • RocketMQ:如果需要高并发高性能,选择RocketMQ。是Alibaba开源项目,贡献给了Apache。在Alibaba内部称为MetaQ,是SpringCould技术组成部分。使用的OpenMessage协议。结构简单,解析快,有事务处设计,有持久化设计。
  • Kafka:Apache开源产品,追求高吞吐量,如果需要超大高并发高性能,对消息处理能力要求很高,并且需要整合大数据流式框架,选择Kafka。Kafka是采用pull的方式来进行消息的获取,底层采用0拷贝技术,减少了用户空间和内核空间的IO操作,从而大大提高了消息读写性能。

消息获取有两种方式:pull和push

        pull:消费者主动去broker中拿取数据进行消费

        push:broker一旦拿到消息后主动推送给相应的消费者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值