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