当前位置: 首页 > article >正文

常用MQ组件选型时需要考虑的问题

在这里插入图片描述

1、常用的MQ组件

ActiveMQ、RocketMQ、RabbitMQ、Kafka

2、应用场景

解耦、异步、削峰

3、队列的缺点

  1. 系统可用性降低:如系统原本运行的好好的,加入消息队列后一旦消息队列挂掉,系统直接就over了
  2. 增加系统的复杂度:采用消息队列后要考虑好多问题,如一致性、如何保证消息不被重复消费、消息的可靠传输
    在这里插入图片描述

4、保证消息队列的高可用

以RCOKETMQ为例,它的集群就有多master模式、多master多slave异步复制模式、多master多slave同步双写模式。

如何保证不会重复消费

1、RabbitMQ会发生一个ACK确认消息
2、RocketMQ会返回一个CONSUME_SUCCESS成功标志
3、Kafka每条消息会有一个offset,在消费后需要提交offset,让消息队列知道已经消费。

如何保证消息的可靠传输

三个角度:生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据

RabbitMQ

  1. RabbitMQ提供transaction和confirm来保证生产者不丢消息

1.1 transaction机制就是说在发送消息的时候开启事务<channel.txSelect()>,然后再发送消息,若发送过程中发生异常则会滚<channel.txRollback()>,成功则提交<channel.txCommit()>,缺点就是吞吐量下降
1.2 confirm模式生产上用的居多,一旦channel进入confirm模式,所有在该信道上的消息都会被指派一个唯一ID(从1开始),一旦消息投递到所匹配的队列都,RabbitMQ会发送一个Ack(包含消息的唯一ID)给生产者,这就知道已经消费处理了,如果RabbitMQ没有处理这条消息,则会发送一个Nack消息给你,这就知道消费失败,然后就可以重试了。

  1. RabbitMQ消息队列丢数据

处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个Ack信号。这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack信号,生产者会自动重发。

? 那么如何持久化呢,这里顺便说一下吧,其实也很容易,就下面两步 将queue的持久化标识durable设置为true,则代表是一个持久的队列

? 发送消息的时候将deliveryMode=2

这样设置以后,rabbitMQ就算挂了,重启后也能恢复数据

  1. RabbitMQ消费者丢数据

消费者丢数据一般是因为采用了自动确认消息模式(采用手动提交即可)

Kafka

在这里插入图片描述
该topic的replication factor为多少(也即该partition有多少个replication),Producer只将该消息发送到该Partition的leader,leader会将该消息写入本地log,每个Follower都从Leader中pull数据。

  1. Kafka生产丢失数据

在kafka生产中,基本都有一个leader和多个follwer。follwer会去同步leader的信息。因此,为了避免生产者丢数据,做如下两点配置
第一个配置要在producer端设置acks=all。这个配置保证了,follwer同步完成后,才认为消息发送成功。
在producer端设置retries=MAX,一旦写入失败,这无限重试

  1. Kafka消息队列丢数据

针对消息队列丢数据的情况,无外乎就是,数据还没同步,leader就挂了,这时zookpeer会将其他的follwer切换为leader,那数据就丢失了。针对这种情况,应该做两个配置。
replication.factor参数,这个值必须大于1,即要求每个partition必须有至少2个副本
min.insync.replicas参数,这个值必须大于1,这个是要求一个leader至少感知到有至少一个follower还跟自己保持联系。这两个配置加上上面生产者的配置联合起来用,基本可确保kafka不丢数据

  1. Kafka消费者丢数据

这种情况一般是自动提交了offset,然后你处理程序过程中挂了。kafka以为你处理好了。解决方案也很简单,改成手动提交即可。

offset介绍:
offset:指的是kafka的topic中的每个消费组消费的下标。简单的来说就是一条消息对应一个offset下标,每次消费数据的时候如果提交offset,那么下次消费就会从提交的offset加一那里开始消费。
比如一个topic中有100条数据,我消费了50条并且提交了,那么此时的kafka服务端记录提交的offset就是49(offset从0开始),那么下次消费的时候offset就从50开始消费。

在这里插入图片描述


http://www.kler.cn/news/364552.html

相关文章:

  • 网站被浏览器提示“不安全”,如何快速解决
  • AI模型算法的入门级使用教程
  • 自学C语言——函数(全)
  • 循环双链表,将L改造为L=(a1,a3,…,an,a4,a2)
  • 关于移动硬盘复制文件0x80071AC3错误解决方法
  • colcon构建ros2功能包时,出现exited with code 2报错的解决方案(bug)
  • 独家大模型经典面试秘籍:问题答案超详细,收藏此文就够咯
  • AnaTraf | 探讨TCP握手时延
  • JavaScript正则表达式利器:exec()方法深度解析与应用实例
  • pnpm : 无法加载文件...
  • 用户画像中不同机器学习模型的优缺点和适用场景
  • Apache Flink 2.0-preview released
  • 如何在Debian操作系统上安装Docker
  • 每日回顾:简单用C写 归并排序
  • 光通信——前传基本架构
  • Next.js14快速上手
  • spark sql 广播模式参数
  • 二叉树的性质
  • 基于Springboot在线视频网站的设计与实现
  • 深入解析东芝TB62261FTG,步进电机驱动方案
  • python之数据结构与算法(数据结构篇)—— 线性表
  • 笛卡尔空间内的阻抗控制
  • DAY62WEB 攻防-PHP 反序列化CLI 框架类PHPGGC 生成器TPYiiLaravel 等利用
  • openresty安装
  • 【再谈设计模式】工厂模式~制造者的艺术
  • tomcat基本配置