ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

RocketMQ知识点

RocketMQ知识点 ^^《榴芒客服系统》是我们工作室开发的在线客服系统欢迎下载试用《榴芒客服系统》https://blog.csdn.net/look4liming/article/details/164755808RocketMQ是队列式的消息中间件。由Producer、Consumer、Broker、NameServer组成。Productor创建消息Broker存储消息Consumer处理消息。Producer向队列发送消息队列的集合称为Topic。Consumer可以做广播消费或集群消费。做广播消费时一个Consumer消费Topic上的所有队列做集群消费时多个Consumer平均消费Topic上的所有队列保证消息的顺序性。消息消费支持拉取和推送两种模式。MQ推送消息给消费者实际上也是通过拉取的方式实现的。RocketMQ的各组件均可水平扩展。支持主从备份防止数据丢失主节点故障可自动分流到备用节点。支持分布式事务通过两段式提交和回查确保消息发送和数据库变更的最终一致性RabbitMQ和Kafka都不支持。Broker实际上就是一台服务器每个Broker上可以存储多个Topic的消息每个Topic的消息可以分布在多个Broker上。消息队列中存储的是消息的物理地址每个Topic的消息地址存储于多个消息队列上消息队列相当于Topic的分区。NameServer可集群部署NameServer之间不同步任何数据。要先启动NameServer再启动Broker。NameServer是服务注册中心用于管理Broker。Broker启动时把自己注册到NameServerProducer拿着Topic信息到NameServer查询然后和Broker建立连接。NameServer将数据存储在内存中关闭NameServer数据就丢失了。重启NameServer它通过Producer、Broker、Consumer的心跳将集群的元数据信息再重现出来。NameServer负责服务发现和路由寻址为客户端提供Broker列表、Topic和Broker的映射。客户端可以配置多个NameServer这样当某个NameServer不可用时可以切换到其他节点。NameServer不支持强一致性而是关注高可用性和高吞吐量并且可能存在短时的路由信息不一致。NameServer与Broker是保持长连接的每隔30秒检测Broker是否存活Broker不可用时NameServer会从路由注册表中剔除该Broker。Broker用于存储消息接收来自Producer的消息Consumer从这里取得消息。Broker也存储与消息有关的元数据用户组、偏移量、队列等。Broker有两种类型Master、Slave。Master既能写也读Slave是只读的。Master和Slave是一对多的Master和Slave具有相同的Broker name但是BrokerId不同BrokerId为0的是Master非0的是Slave。Broker有4种集群部署方式单Master、多Master、多Master多Slave异步复制、多Master多Slave同步双写。单Master一旦Broker宕机会导致整个服务不可用。多Master所有Broker都是Master没有Slave。单台机器宕机会导致该机器上的消息无法消费消息实时性会受影响。多Master多Slave异步复制每个Master对应一个Slave消息采用异步复制方式主备之间有毫秒级消息延迟。这种方式消息丢失少且消息实时性不会受影响Master 宕机后消费者可以继续从 Slave 消费过程对用户应用程序透明不需要人工干预性能同多 Master 方式几乎一样。缺点是 Master 宕机时在磁盘损坏情况下会丢失极少量消息。多Master多Slave同步双写每个Master对应一个Slave主备都写成功才返回成功。这种方式数据与服务都没有单点问题Master宕机时消息无延迟服务与数据的可用性非常高。相对异步复制方式发送消息的延迟会略高。Producer有三种类型NormalProducer标准生产者用于发送常规消息不保证消息的顺序性或事务性。OrderProducer顺序生产者保证同一主题内消息的顺序性。TransactionProducer事务生产者用于支持分布式事务确保消息发送与本地事务操作的原子性。在消息发送前执行预提交操作并在事务成功或回滚后确认或撤销消息。有3种消息发送方式同步发送、异步发送、单向发送。同步发送发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。一般用于重要通知消息。用于链路耗时较长、对响应时间敏感的业务场景异步发送发出数据后不等接收方发回响应接着发送下个数据包。单向发送只负责发送消息、不等待服务器回应、没有回调用于耗时非常短但对可靠性要求不高的场景如日志收集。Producer Group通常发送一类消息并且发送逻辑一致所以将这些Producer分组在一起。生产者通过Producer Group的名字来标记自己是一个集群。Producer的使用流程启动流程1、初始化创建DefaultMQProducer实例设置生产者组名、NameServer地址等配置。2、连接NameServer生产者会连接到NameServer集群获取Topic的路由信息。3、发送消息生产者根据路由信息选择合适的Broker通过网络通信客户端如Netty发送消息到Broker。4、失败重试如果消息发送失败生产者会根据配置的重试策略进行自动重试。Producer是完全无状态的可集群部署。Producer每隔30秒从NameServer同步一次Topic信息如果有Broker不可用30秒后Producer就能知道但在此期间发往不可用的Broker的消息都会失败。Producer每隔30秒向Broker发送心跳Broker每隔10秒扫描存活的连接如果2分钟内没有收到心跳Broker会断开与Producer的连接。Consumer也称为消息订阅者负责从Broker接收消息、消费消息。Consumer有2种类型推模式消费者、拉模式消费者。推模式下消费者需要设置消息处理的回调函数当新消息到达时RocketMQ会调用这个回调函数来处理消息。Consumer Group将消费同一类消息、消费逻辑一样的Consumer组合成消费者组。同一条消息只能被某一Consumer Group的一个Consumer消费但是可以同时被不同Consumer Group消费。Consumer每隔30秒从NameServer获取Topic信息如果Broker不可用Consumer需要30秒才会知道。Consumer每隔30秒向Broker发送心跳Broker每隔10秒扫描一次连接2分钟内没有回应的连接会被关掉并通知Consumer Group中的所有ConsumerConsumer重新分配队列然后继续消费。如果Consumer发现Master宕机会自动转向Slave因为Slave和Master的数据同步有延迟所以可能会丢失一些消息。等Master恢复运行丢掉的消息最终会被消费。Producer发送消息的流程连接NameServer获取Topic的Broker列表通过负载均衡算法选取一个Broker发送消息Broker将消息存储到CommitLog根据消息的Topic和Queue更新ConsumeQueue如果是事务消息Producer需要完成事务的提交或回滚确保消息最终一致。NameServer与Broker保持长连接每隔30秒检测Broker是否存活超过120秒Broker还是不可达则从路由表中移除该Broker。在集群模式下一条消息只能被一个消费者消费在广播模式下消息会被订阅该Topic的所有消费者消费。消费者消费完一条消息后会向Broker发送ACKBriker根据ACK更新消息位点。消费失败消息通过配置的消费策略进行重试或者进入死信队列。消息Message必须与主题Topic对应。可以给消息设置标签Tag和键值对这个机制允许为消息设置业务key方便在Broker上查找该消息方便开发阶段定位问题。主题Topic是消息的第一级类型。标签Tag是消息的第二级类型消息可以没有Tag。例如Topic是人类则Tag可以是中国人、美国人、俄罗斯人等。主题下可以有多个消息队列Message QueueRocketMQ会轮询主题下的所有消息队列将消息发出去。两种消费模式集群模式Clustering广播模式Broadcasting。默认消费模式是集群模式该模式下一条消息只能被消费者组中某一消费者消费。广播模式下某一消息会被消费者组中的每个消费者消费。两种消息顺序顺序消费并行消费。顺序消费是指消息消费的顺序和消息产生的顺序一致。所以如果业务要求全局顺序消费则主题只能有一个消息队列。并行消费不保证消息顺序。RocketMQ基于主题的发布与订阅模式观察者模式。因为Topic的路由路由信息无需在集群内保持强一致最终一致所以NameServer间无需通信。消息存储在文件组上文件组内每个文件大小固定便于映射到内存。消息顺序写也提高了IO效率队列文件和索引文件方便消费和查找。RocketMQ中消息有可能会被重复消费所以开发者需要自己保证不重复消费消息如幂等消费。Broker Master和Broker Slave主从结构它们之间会执行数据同步。Producer与Broker Master建立长连接只能将消息发送给Broker Master。Consumer与Broker Master和Broker Slave都建立长连接既可以从Broker Master订阅消息也可以从Broker Slave订阅消息。RocketMQ中消息的顺序是分区Queue顺序不是全局顺序。如果主题中只有一个分区且消费者只有一个就能实现全局顺序。消费者可以通过规则只消费某一主题下自己感兴趣的消息这个机制称为消息过滤消息过滤分为服务端过滤和消费端过滤。所有消息主题存储在名为CommitLog的文件中该文件默认大小为1GB达到上限后会生成新文件。每个消息队列有自己的QueueConsume文件存储了CommitLog中消息的偏移量逻辑和物理、消息大小等信息。IndexFile文件支持消息按关键字查询。同步刷盘、异步刷盘。RocketMQ通过消费确认ACK保证消息至少被消费一次因为ACK丢失等异常情况的发生消息可能会被重复消费。对于已消费成功的消息如果需要重新消费可以使用消息回溯机制支持按时间回溯精确到毫秒可以向前或向后回溯。RocketMQ的消息存储文件默认保留3天3天后过期清理。RocketMQ支持消息延迟级别用于定时消费消息。RocketMQ支持消息重试机制。^^《榴芒客服系统》是我们工作室开发的在线客服系统欢迎下载试用《榴芒客服系统》https://blog.csdn.net/look4liming/article/details/164755808
返回列表