MQ相关概念

MQ

1
2
消息队列(Message Queue,简称MQ),本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。
其主要用途:不同进程Process/线程Thread之间通信。
产生消息队列的原因
1
2
3
4
5
1.不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程.
为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个。

2.同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了。
并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列。

应用场景

  • 服务解耦:系统之间拆分、隔离后的通信,之间的弱依赖可用消息中间件解耦
  • 削峰填谷:秒杀大促,把流量高峰和低谷做一个均衡。把消息缓存然后慢速消费。
  • 异步化缓冲:异步操作,只需做到最终一致性。

应用思考

  • 生产端可靠性投递:消息不丢失,100%投递
  • 消费端幂等:验证消息,防止消息被消费多次
其余点
  • 高可用
  • 低延迟
  • 可靠性
  • 堆积能力
  • 可扩展性

技术选型

  • 各个MQ的性能、优缺点、相应的业务场景
  • 集群架构模式、分布式、可扩展性、高可用、可维护性
  • 综合成本问题、集群规模、人员成本
  • 未来的方向、规划、思考

ActiveMQ

古老而又神秘的消息中间件”ActiveMQ”

1
采用zookeeper做主备

RabbitMQ集群架构模型与原理解析

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于 AMQP协议的。

四种集群架构

  • 主备模式:warren(兔子窝),主备方案(主挂了采用HAproxy做切换)

mark

1
2
3
4
5
6
7
# 主备模式-HAproxy配置
listen rabbitmq_cluster
bind 0.0.0.0:5672 #配置TCP模式
mode tcp #简单的轮询
balance roundrobin #主节点
server liyk1 192.168.1.1:5672 check inter 5000 rise 2 fall 2
server liyk2 192.168.1.2:5672 backup check inter 5000 rise 2 fall 2 #备用节点
  • 远程模式:远距离通信和复制,可以实现双活的一种模式,简称Shovel模式。(很少使用)

mark

  • 镜像模式:经典模式,mirror镜像模式,保障数据不丢失。实际工作中用的最多,并且实现集群非常简单,一般互联网公司都会使用这种镜像集群模式。
    • Mirror镜像队列:高可靠(往每个节点发数据)、数据同步、奇数节点(3个就行,缺点无法横向扩展因为扩展的节点也只是备份前面的数据)
      mark
  • 多活模式:实现异地数据复制的主流模式
    • Federation:多活模式,federation插件

mark


RocketMQ

RocketMQ是一款分布式、队列模型的消息中间件,由阿里巴巴自主研发的一款适用于高并发、高可靠性、海量数据场景的消息中间件。


Kafka

介绍

  • kafka是Linkedln开源的分布式消息系统,目前归属于apache顶级项目
  • 特点是基于pull的模式来处理消息消费,追求高吞吐量。最初目的就是用于日志收集和传输。
  • 支持复制,不支持事务,对消息重复、丢失错误没有严格要求,适合大量数据的收集业务。比如日志。

特点

  • 分布式:支持消息分区,topic下的patition
  • 跨平台:java、python、php都支持
  • 实时性:只要存储可以,不影响消息接收、堆积能力强
  • 伸缩性

kafka高性能的原因

  • 顺序写,page cache‘空中接力’(本质上把从磁盘中读取数据变为从内存中读取),高效读写
  • 高性能、高吞吐
  • 后台异步、主动flush
  • IO预读策略

mark

mark

零拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
mmap和sendFile这2个零拷贝
简单说就是:数据不需要来回的拷贝,大大提升系统的性能。
是指CPU不执行拷贝数据从一个存储区域到另外一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。
# 避免数据拷贝
避免操作系统内核缓冲区之间进行数据拷贝操作;
避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作;
用户应用程序可以避开操作系统直接访问硬件存储。
# 零拷贝带来的好处
1.减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他任务。
2.减少内存带宽的占用
3.减少用户空间和操作系统内核空间之间的上下文切换

零拷贝完全依赖于操作系统,操作系统级别的支持
  • 缓冲区
    1
    缓冲区是所有IO的基础,IO讲的无非就是把数据移进或移出缓冲区;进程执行IO操作,就是向操作系统发出请求。让它要么把缓冲区的数据排干(写),要么填充缓冲区(读)。

mark

  • 虚拟内存
    1
    2
    3
    操作系统使用虚拟内存,虚拟地址取代物理地址好处如下:
    1、一个以上的虚拟地址可以指向同一个物理内存地址
    2、虚拟内存空间可大于实际可用的物理地址

mark

零拷贝的2种方式
  • mmap+write方式
    1
    2
    3
    使用mmap+write方式代替原来的read+write方式,mmap是一种内存映射文件的方法。
    即将一个文件或其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一映射关系。
    这样可以省掉原来内核read缓冲区copy数据到用户缓冲区,但是还是需要内核read缓冲区将数据copy到内核socket缓冲区。

mark

  • sendfile方式
    1
    2
    3
    简化通过网络在2个通道之间进行的数据传输过程,sendfile系统调用的引入,不仅减少了数据复制,还减少了上下文切换的次数。
    数据传输只发生在内核空间,所以减少了一次上下文切换。
    上下文切换(Context Switch),性质为环境切换。上下文切换,有时也称做进程切换或任务切换,是指CPU 从一个进程或线程切换到另一个进程或线程。

mark

kafka集群模式

1
2
3
大部分做的内存的replicate;
当kafka的生产者和消费者速率相当时都不需要用到磁盘,直接从内存page cache取数据。
内存级别的副本。

mark


小结

mark

-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。