RabbitMQ 小记

RabbitMQ

同步http 弱依赖

RabbitMQ 作用

服务解耦 削峰作用 异步化缓冲

应用思考点:

  • 生产端的可靠性投递
  • 消费端幂等性(幂等性, 不会出现消费两次这种情况)
  • 低延迟
  • 高可用
  • 可靠性(replica)
  • 堆积能力
  • 扩展性- 是否支持无感知的横向扩容

集群架构模式

ActiveMQ

  • 承载能力不是特别优秀
  • 不适合高并发,海量数据
  • 适用于中小型业务系统

RabbitMQ

  • RabbitMQ横向扩展能力不是特别好
  • 可用性和可维护性都非常好。
  • 高可靠性

RocketMQ - Alibaba开源产品

  • 扩展性强,高可用性好,可维护性有点麻烦

Kafka - 高吞吐,海量数据

  • 扩展性强,高可用性好,可维护性有点麻烦,可靠性不是非常高。

~~选什么,都需要综合起来考虑。

RabbitMQ 四种集群结构

  • 主备模式 1主-1备 HaProxy
  • 远程模式 - 不好用,配置非常麻烦
  • 镜像模式 Mirror模式 保证100%数据不丢失, 很多公司都是利用这种模式来搭建RMQ集群
    • 高可靠
    • 数据同步非常及时.
    • 奇数个节点(防止脑裂,做选举的时候更快选出主节点).
  • 缺点:不支持横向扩展,官方建议3个就够了。再多了,只会增加同步的负担。
  • 多活模型 - 异地容灾,数据转储
    • 应对无法横向扩展的问题。
    • 依赖federation插件.
    • 配置不复杂.
  • warren (兔子窝).

Kafka

  • 追求高吞吐量,尤其适用于日志的收集和传输
  • 不支持事务(为了性能)
  • 对消息的重复、丢失,错误没有严格要求。
  • 分布式
  • 实时和异步都可以。
  • 支持水平扩展

Kafaka 高性能的原因

  • 顺序写
  • PageCache

rabbitmq术语

  • Server
  • Connection
  • Channel 通信信道 - 类似于session
  • Message [properties|body]
  • Virtual Host
  • Exchange
  • Binding - Exchange和Queue 之间的虚拟绑定,binding中可以包含routing key
  • Routing Key
  • Queue

Kafka 支持java php python

乐观锁机制SQL

$product_id = 1024
$version = 3
update table_name set count = count - 1, version = version -1 where product_id = $product_id and version = $version

es 也有一个version保证幂等性

幂等性

不管你执行多少吃,结果都是相同的,唯一的。e.g. 秒杀一件商品,不会出现卖不出去或者超卖情况。

消费端-幂等性保障方案

唯一ID+指纹码,先查询如果没有,新建一个,如果已经有了,返回失败。
利用Redis的原子性操作.

RocketMQ

缺点

  • 不支持事务
  • 阿里云上RocketMQ收费。
  • 不支持主从自动切换

HA-proxy TCP级别的负载. KeepAlived 提供高可用。

RMQ Note

rabbitmqctl list_queues
rabbitmqctl list_vhosts

exchange 类型

  • direct
  • topic
  • fanout
String <-> Byte[]
String str = "hello,world";
byte[] bytes = str.getBytes();
String str = new String(bytes);

使用Builder() 创建的实例,一般都是链式编程,最后一般都需要调用一下.build(); 返回完整的实例。

Spring Boot RabbitMQ

@RabbitMQListener 监听注解
    @QueueBinding
    @Queue
    @Exchange

Leave a Comment

Your email address will not be published. Required fields are marked *

PHP 8.1.1 - 26.647 ms, 0 Q