热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

消息队列知识汇总

基础 消息队列的作用 削峰 解耦 异步 常用消息队列的比较 特性 ActiveMQ RabbitMQ RocketMQ kafka 吞吐量 万级 万级 十万级 十万级 top

基础

消息队列的作用

  • 削峰
  • 解耦
  • 异步

常用消息队列的比较

特性 ActiveMQ RabbitMQ RocketMQ kafka
吞吐量 万级 万级 十万级 十万级
topic数量对吞吐量的影响 topic达千量级时,吞吐量较少幅度下降 topic达百量级时,吞吐量下降明显
时效性 毫秒 微秒 毫秒 毫秒
可用性 主从 主从 分布式 分布式
消息可靠性 极小概率丢失 参数优化后可保证0丢失 参数优化后可保证0丢失
功能支持 完备 完备 完备 简单
劣势 可靠性低 erlang语言开发 社区活跃度一般 topic数量过多时导致的吞吐量下降,存在消息重复消费
突出优势 极小时延,社区活跃 消息事务,阿里出品 吞吐量极高,社区活跃

关于Kafka

kafka高吞吐量的原因

  • 顺序读写,顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间
  • 零拷贝
  • 分区,topic中的内容可以被分为多分partition存在,每个partition又分为多个段segment,每次只针对小部分操作,增加并行能力
  • 批量发送
  • 数据压缩

kafka角色说明

假如topic有N个partition,集群有(N+M)个broker,某个topic有N个partition,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。各角色说明如下:

  • broker,服务器节点
  • topic,主题,每条发布到Kafka集群的消息都有一个主题
  • partition,分区,topic中的数据分割为一个或多个partition,每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序
  • Replication,副本,Kafka支持以Partition为单位对Message进行冗余备份,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)
  • leader,主,每个Replication集合中的Partition都会选出一个唯一的Leader,所有的读写请求都由Leader处理。其他Replicas从Leader处把数据更新同步到本地
  • ISR(In-Sync Replica):是Replicas的一个子集,表示目前Alive且与Leader能够“Catch-up”的Replicas集合

kafka的高可用框架

消息队列知识汇总
image.png

kafka的消息可靠性

  • request.required.acks设置为1 ,即ISR集合中的副本都同步后才算发送成功
  • min.insync.replicas设置ISR最小副本数

kafka的副本复制机制

  • 既不是完全的同步复制也不是单纯的异步机制。
  • HW,一个分区的最后一条消息的offset
  • LEO,一个分区副本最后一条消息的offset
  • 当一个失败的副本重启的时候,它首先恢复磁盘中记录的HW,然后将它的消息truncate到HW这个offset。这是因为HW之后的消息不能保证已经commit了(也许leader上并没有HW之后的消息)

kafka消息的可靠性

消息不丢失

  • 生产端,事务发送
  • 中间件,acks配置设置为-1和ISR最小副本数
  • 消费端,
    消息重复
  • 生产端,幂等防重
  • 中间件,
  • 消费端,

kafka的顺序消费

单线程指定partition发送,单线程指定partition消费

rocketMq事务消息原理

消息队列知识汇总
RocketMQ事务消息原理
  • mmap+write
  • sendfile

零拷贝

mmap+write的理解

通过虚拟内存,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数。

消息队列知识汇总
mmap+write

sendfile的理解

数据根本不经过用户态,直接从内核缓冲区进入到 Socket Buffer,同时,由于和用户态完全无关,就减少了两次上下文切换

消息队列知识汇总
sendfile

linux2.4改进版本零拷贝的理解

Linux 在 2.4 版本中,做了一些修改,避免了从内核缓冲区拷贝到 Socket buffer 的操作,直接拷贝到协议栈,从而再一次减少了数据拷贝。

消息队列知识汇总
gether

零拷贝方法使用场景

  • mmap 适合小数据量读写,sendFile 适合大文件传输。
  • mmap 需要 4 次上下文切换,3 次数据拷贝;sendFile 需要 两次 次上下文切换,最少 2 次数据拷贝。
  • rocketMQ、java中的FileChannel+MapperByteBuffer,kafka的索引层采用mmap方式,kafka的传输层采用sendfile方式

RocketMQ

持久化方式

  • 同步刷盘,牺牲性能
  • 异步刷盘,可能导致消息丢失

主从消息同步方式

  • 同步复制,
  • 异步复制,不影响可靠性,主节点从宕机中恢复时会重新复制

主要角色说明

  • Broker,生产者生产消息到 Broker,消费者从 Broker 拉取消息并消费,一个 Topic 分布在多个 Broker 上,一个 Broker 可以配置多个 Topic,它们是多对多的关系。
  • NameServer,Broker 管理和路由信息管理。Broker 会将自己的信息注册到 NameServer 中
  • Producer,生产者
  • Consumer,消费者

    消息队列知识汇总
    RocketMQ角色关系图

消费模式

  • 集群消费,一条消息只能被同一个group的一个Consumer消费
  • 广播模式,消息将对一 个Consumer Group 下的各个 Consumer 实例都消费一遍

如何保证有序

  • 发消息时指定发送到同一个topic的同一个queue(通过重写MessageQueueSelector)
  • 收消息时指定从同一个topic的同一个queue中获取

kafka

Zookeeper的作用

Kafka 使用 ZooKeeper 存放集群元数据、成员管理、Controller 选举,以及其他一些管理类任务,但新版本已经将zookeeper取代了。

领导者副本(Leader Replica)和追随者副本 (Follower Replica)

就是传统意义上的主从,主负责读写,从负责备份,也能提供读能力


推荐阅读
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • 从单机存储进化为接口和存储的分离概述接口服务层对外提供REST服务,数据服务层提供数据存储功能。两者之间通过消息队列进行通信,数据服务层的所有数据服 ... [详细]
  • 分布式一致性算法:Paxos 的企业级实战
    一、简介首先我们这个平台是ES专题技术的分享平台,众所周知,ES是一个典型的分布式系统。在工作和学习中,我们可能都已经接触和学习过多种不同的分布式系统了,各 ... [详细]
author-avatar
无为南子_274
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有