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

开发笔记:KafkaRabbitMQRocketMQActiveMQzeroMQRedisPulsar消息队列

篇首语:本文由编程笔记#小编为大家整理,主要介绍了KafkaRabbitMQRocketMQActiveMQzeroMQRedisPulsar消息队列相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了KafkaRabbitMQRocketMQActiveMQzeroMQRedisPulsar消息队列相关的知识,希望对你有一定的参考价值。






消息队列

什么是消息中间件



消息中间件,是利用高效可靠的消息传递机制进行异步的数据传输,并基于数据通信进行分布式系统的集成。通过提供那个消息队列模型和消息传递机制,可以在分布式环境下扩展进程间的通信。



消息中间件的传递模式



1.点对点模式


消息生产者讲消息发送到队列种,消息消费者从队列中接收消息。消息可以在队列中进行异步传输。


在这里插入图片描述



2.发布/订阅模式


发布订阅模式是通过一个内容节点来发布和订阅消息,这个内容结点成为主题,消息发布者将消息发布到某个主题,消息订阅者订阅这个主题的消息,主题相当于一个中介。主题的消息的发布与订阅相互独立,该模式的消息的传播是一对多的模式。


在这里插入图片描述


消息中间件可以做什么



应用程序之间可以不采取直接通信,而是采取消息中间件作为中介,做到数据的异步通信。开发人员不需要考虑网络协议和远程调用的问题,只需要通过各种消息中间件提供的API,就可以完成简单的消息推送,和消息接收等业务功能。


消息的生产者将消息存储到队列中,消息的消费者不一定马上消费消息,可以的能到自己想要用到这个消息的时候,再从响应的队列中获取消息。这样的设计可以很好的解决大数据传输过程中占用资源的问题,使数据传递和平台分开,不需要分配资源用于数据传输,有效的利用当前的资源。



常见的消息队列


Message Quene(MQ)


  • Message

在互联网中,多台设备产生通信的数据的总称:可以是视频、文本、音频等等。

  • Quene

一种特殊的线性表,满足先进先出的原则。

Kafka介绍



kafka是分布式的基于消息的发布-订阅的消息队列。LinkedIn(领英),Scala编写的


在这里插入图片描述


2.2 三大特点



  • 高吞吐量

可满足每秒百万级别的消息的生产和消费


  • 持久性

具备一套完整的消息的存储机制,可以确保消息数据的高效的安全的持久化


  • 分布式

既有扩展以及容错性。



2.3 kafka服务



  • topic : 主题,kafka处理的消息分为不同的分类,分类就是按照主题来划分。
  • broker:消息服务器的代理。kafka集群中的一个节点一般我都门都叫做一个broker;主要是用来存储消息。存在硬盘中。
  • partition:分区。Topic的在物理上的分组。一个topic在broker上被分为1个或者多个partition。分区在创建主题的时候指定的。
  • message:消息,通信的基本单位,每个消息属于某一个partition
  • Producer: 生产者,消息和数据都是由这个组件产生的,由它发送到kafka集群中的。
  • Consumer:消费者,消息和数据都是由这个组件来消费的。
  • Zookeeper: 他需要zk来做分布式协调


Kafka架构

在这里插入图片描述


RabbitMQ消息队列



使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现


AMQP协议更多的用于企业系统中,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。AMQP(高级消息队列协议)是一个进程间传递一部消息的网络协议。发布者发布消息,经过交换机,交换机根据路由规则将收到的消息分发给交换机绑定的队列,最后AMQP代理会将消息传递给此队列的消费者,或者消费者按照需求自动获取。


在这里插入图片描述


RocketMQ消息队列



RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache的顶级项目,它是纯Java开发,具有高吞吐量、高可用性、适合大闺蜜分布式系统的特点。


该消息队列的设计思路起源于Kafka,他对消息的可靠传输和事务的性能做了优化,目前被阿里集团广泛应用于交易、充值、流计算、消息推送、日志流处理、binglog分发等场景。


在这里插入图片描述


ActiveMQ消息队列



Apache的开源产品,完全支持JMS规范的消息中间件,是一个纯Java的程序,因此只需要操作系统支持Java虚拟机的,ActiveMQ即可执行。


JMS即为Java Message Service的应用程序接口,是一个Java平台中关于面向消息中间件的API,用于在两个程序之间,或分布式系统中发送消息,进行异步通信。


在这里插入图片描述



1.Distination目的地,消息发送者需要指定Destination才能发送消息,接收者需要指定Destination才能接收消息


2.Producer是生产者,生产数据,Consumer是消费者,接收数据


3.Message是消息封装一次后通信的内容



zeroMQ



正确的说,zeroMQ不是TCP,不是socket,也不是消息队列,而是这些的综合体


zeroMQ又称Ø MQ


Ø 也是一个非常奇妙的符号:


1.Ø 是一种权衡


2.Ø 暗合“零代理”、“零延迟”


3.Ø 的目标是“零管理、零消耗、零浪费”


4.Ø 符合简约注意,以减低复杂度作为力量的源泉,而不是增加新的功能


zeroMQ与消息队列相比的特点:



1.点对点无中间节点


致力于把点对点模式做到极致


2.强调消息收发机制


对通信的模式做了总结


例如数据的推送,接收 等


  • PUB and SUB
  • REQ and REP
  • REQ and XREP
  • XREQ and REP
  • XREQ and XREP
  • XREQ and XREQ
  • XREP and XREP
  • PUSH and PULL
  • PAIR and PAIR

3.以统一接口支持多种底层通信方式


不管是线程间通信,进程间通信还是跨主机通信,zeroMQ都使用同一套API进行调用,在调用的时候只需要修改对应的协议名称即可



Redis实现消息队列



Redis实现轻量级的消息队列与消息中间件,没有高级特性也没有ACK保证,无法做到数据不重不漏,如果业务简单而且对消息的可靠性要求不严格的可以试用。



Redis存储类型:



Redis中列表List类型是按照插入顺序的字符串链表,和数据结构中的普遍链表一样,可以在头部left和尾部right添加新的元素。插入时如何键不存在Redis将为该键创建一个新的链表。如果链表中所有元素均被删除,那么该键也被删除。


Redis的列表List可以包含的最大元素数量为4294967295,从元素插入和删除的效率来看,如果是在链表的两头插入或删除元素将是非常高效的操作。即使链表中已经存储了数百万条记录,该操作也能在常量时间内完成。然后需要说明的是,如果元素插入或删除操作是作用于链表中间,那将是非常低效的。


Redis中对列表List的操作命令中,L表示从左侧头部开始插入和弹出,R表示从右侧尾部开始插入和弹出。


Redis提供了两种方式来做消息队列,一种是生产消费模式,另一种是发布订阅模式。



生产消费模式



生产消费模式会让一个或多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的。如果队列中没有消息,消费者会继续监听。



PUSH/POP



Redis数据结构的列表List提供了push和pup命令,遵循着先入先出FIFO的原则。使用push/pop方式的优点在于消息可以持久化,缺点是一条消息只能被一个消费者接收,消费者完全靠手速来获取,是一种比较简陋的消息队列。


Redis的队列list是有序的且可以重复的,作为消息队列使用时可使用rpush/lpush操作入队,使用lpop/rpop操作出队。当发布消息是执行lpush命令,将消息从列表左侧加入队列。消息接收方执行rpop命令从列表右侧弹出消息。


如果队列空了怎么办呢?


如果队列空了,消费者会陷入pop死循环,即使没有数据也不会停止。空轮询不但消耗消费者的CPU资源还会影响Redis的性能。傻瓜式的做法是让消费者的线程按照一定的时间间隔不停的循环和监控队列,虽然可行但显然会造成不必要的资源浪费,而且循环周期也很难确定。


对于消费者而言存在一个问题,需要不停的调用rpop查看列表中是否有待处理的消息。每调用一次都会发起一次连接,势必造成不必要的资源浪费。如果使用休眠的方式让消费者线程间隔一段时间再消费,但这样做也有两个问题:


如果生产者速度大于消费者消费的速度,消息队列长度会一直增大,时间久了会占用大量内存空间。
如果休眠时间过长,就无法处理一些时效性的消息。如果休眠时间过短也会在连接上造成比较大的开销。
当LPOP返回一个元素给客户端时会从List中将该元素移除,这意味着该元素只存在于客户端的上下文中。如果客户端在处理这个返回元素的过程中崩溃了,这个元素就会永远的丢失掉。


在这里插入图片描述


pulsar消息队列



待补充


在这里插入图片描述






推荐阅读
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
author-avatar
子华2502924833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有