消息中间件

消息中间间选型分析

≯℡__Kan透↙ 提交于 2019-12-02 18:56:07
一、前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。 目前开源的消息中间件可谓是琳琅满目,能让大家耳熟能详的就有很多,比如 ActiveMQ、RabbitMQ、Kafka、RocketMQ、ZeroMQ 等。不管选择其中的哪一款,都会有用的不趁手的地方,毕竟不是为你量身定制的。有些大厂在长期的使用过程中积累了一定的经验,其消息队列的使用场景也相对稳定固化,或者目前市面上的消息中间件无法满足自身需求,并且也具备足够的精力和人力而选择自研来为自己量身打造一款消息中间件。但是绝大多数公司还是不会选择重复造轮子,那么选择一款合适自己的消息中间件显得尤为重要。就算是前者,那么在自研出稳定且可靠的相关产品之前还是会经历这样一个选型过程。 在整体架构中引入消息中间件,势必要考虑很多因素,比如成本及收益问题,怎么样才能达到最优的性价比?虽然消息中间件种类繁多,但是各自都有各自的侧重点,选择合适自己、扬长避短无疑是最好的方式。 二、各类消息队列简述 ActiveMQ 是 Apache 出品的、采用 Java 语言编写的完全基于 JMS1

消息队列中间件Celery、RabbitMQ

China☆狼群 提交于 2019-12-02 14:29:43
消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。 目前开源的消息中间件可谓是琳琅满目,能让大家耳熟能详的就有很多,比如ActiveMQ、RabbitMQ、Kafka、RocketMQ(阿里)、ZeroMQ等。不管选择其中的哪一款,都会有用的不趁手的地方,毕竟不是为你量身定制的。有些大厂在长期的使用过程中积累了一定的经验,其消息队列的使用场景也相对稳定固化,或者目前市面上的消息中间件无法满足自身需求,并且也具备足够的精力和人力而选择自研来为自己量身打造一款消息中间件。但是绝大多数公司还是不会选择重复造轮子,那么选择一款合适自己的消息中间件显得尤为重要。就算是前者,那么在自研出稳定且可靠的相关产品之前还是会经历这样一个选型过程。 消息队列是消息在传输的过程中保存消息的容器。 celery:流程图: <ignore_js_op> RabbitMQ AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的 中间件 设计。消息中间件主要用于组件之间的解耦

C#调用RabbitMQ实现消息队列

妖精的绣舞 提交于 2019-12-02 02:45:26
前言 我在刚接触使用中间件的时候,发现,中间件的使用并不是最难的,反而是中间件的下载,安装,配置才是最难的。 所以,这篇文章我们从头开始学习RabbitMq,真正的从头开始。 关于消息队列 其实消息队列没有那么神秘,我们这样想一下,用户访问网站,最终是要将数据以HTTP的协议的方式,通过网络传输到主机的某个端口上的。 那么,接收数据的方式是什么呢?自然是端口监听啦。 那消息队列是什么就很好解释了? 它就是端口监听,接到数据后,将数据排列起来。 那这件事,我们不用中间件能做吗? 当然能做啦,写个TCP/UDP/Socket的软件就可以做啦。 举个简单的例子,如下图: 既然自己可以做消息队列,那为什么要用RabbitMQ? 因为,RabbitMQ成熟的开源中间件,可靠性有保证,bug少,性能也非常好。 而C#代码默认是使用托管内存的,所以,想写出媲美RabbitMQ性能的消息队列,就必须离开我们常用的托管内存,使用非托管内存,但这个代价就太大了;而且最终能否达到RabbitMQ的性能水平还是个未知数。 还有就是RabbitMQ除了基础的消息队列管理,还有很多很强大的额外功能,而自己开发消息队列,很难如此尽善尽美。 ---------------------------------------------------------------------------------------

消息中间件如何解决消息丢失问题

拜拜、爱过 提交于 2019-12-01 09:45:39
为了解决消息丢失问题,我们引入了一些重发机制,但也带来的另外一个问题:消息重复,我们来看下都有哪些情况会导致消息重复: 消息发送超时,处于不确定状态,导致重试发送消息,有可能之前的消息已经发送成功,会出现消息重复的情况。解决的思路是,每个消息生成一个消息id,如果发送的消息Broker已经存在了,则丢弃。这种解决办法需要维护一个已经接收的消息的message id list。 消息在Broker中只有一份,但是consumer重启前,未及时更新offset,导致consumer重启之后重复消费消息。 上游业务给每个message 分配一个message ID,下游业务在接收到message之后,执行业务并且保存message ID,而且要讲两部分放到同一个事务中,保证业务执行成功,message ID肯定保存,业务执行失败,message ID肯定不会保存下来,利用db中存储的message id来做幂等。我们可以重新封装producer client和consumer client,将这部分message ID分配和判重的逻辑封装到client lib里面。 来源: https://www.cnblogs.com/Yanss/p/11676041.html

【RabbitMQ消息中间件】13.RabbitMQ结合SSM框架-与销售系统交互

╄→гoц情女王★ 提交于 2019-12-01 08:04:27
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u013517797/article/details/79942172 接上一篇:https://blog.csdn.net/acmman/article/details/79778241 为了方便大家学习,我将博客中编写的仓储系统和销售系统的最终源码分享出来,希望能帮助到大家学习: 仓储系统下载地址:https://download.csdn.net/download/u013517797/10349085 销售系统下载地址:https://download.csdn.net/download/u013517797/10349095 -----------------------------------华丽的分割线(#^.^#)---------------------------------------------- 上次我们编写了RabbitMQ结合SSM框架的数据提供方“仓储系统”的工程,下面我们来编写要从MQ获取信息的“销售系统”,并且实现“仓储系统”与“销售系统”的信息交互。 我们回顾一下之前的最终的信息交互模式图: 其中“仓储系统”用于货物的入库和管理,当货物更新时,将货物信息推送至消息队列。而“销售系统

【RabbitMQ消息中间件】12.RabbitMQ结合SSM框架-编写仓储系统

折月煮酒 提交于 2019-12-01 08:04:23
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u013517797/article/details/79778241 了解了RabbitMQ的基本知识和几大队列模式,以及Spring-Rabbit开源工程的基本原理后,我们动手来实现在实际工作开发中需要与SSM框架结合使用的工程场景。 该场景模拟以下活动: 货仓管理系统用于对货物的管理,它的每一次进货(insert)和修改(update)、删除(delete)都会向消息中间件推送消息,而销售系统会从消息中间件中获取货物的信息,同步至销售系统的数据库。 首先我们创建货仓管理系统,在Eclipse中创建一个名为“Warehouse_Management”的Maven工程: 然后在pom.xml文件中加入Spring/Spring MVC以及MyBatis框架环境需要的依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache

【RabbitMQ消息中间件】10.Spring-Rabbit项目剖析

为君一笑 提交于 2019-12-01 08:00:20
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u013517797/article/details/79601121 之前我们详细介绍了RabbitMQ并且讲解了其5中队列模式,在期间编写了许多小例子。但是在真实的开发阶段,我们很少使用之前编写Demo时的编写方式,一个是不方便,一个是难以维护。所以,在企业级的开发中,一般是结合框架来进行开发的。 一、spring-rabbit项目介绍 在Java开发中,RabbitMQ的开发自然少不了与Spring框架的结合。本篇我们就来了解一下,Spring为我们提供的与RabbitMQ向结合的开源样例工程“Spring-Rabbit”,通过了解该开源工程,我们可以更加了解在实际开发中如何结合Spring来进行RabbitMQ业务的开发。 在Spring的官方网站“spring.io”中,我们可以看到spring团队发布的与spring相关的历届以及最新的框架产品: 而本此我们要了解的,就是spring框架对AMQP协议的支持,即是“spring AMQP”的相关产品: 点击进去之后,可以看到该开源项目的详细介绍: 可以在介绍中看到,该产品包含了两个部分,其中“spring-amqp”是一个基本的抽象实现,而“spring

消息中间件常见问题

人走茶凉 提交于 2019-12-01 02:55:11
高可用,重复消费,幂等,可靠性传输,消息丢失 1、 kafka,rabbitMQ,activemq,rocketMQ使用场景及区别技术选型 吞吐量、topic数量对吞吐量的影响、时效性、可用性、可靠性、核心特点、优劣势总结 activemq:吞吐量万级 非常成熟,功能比较强大,大量的公司再项目中有应用 偶尔会有低概消息丢失,近些年应用越来越少 官方社区维护越来越少,而且确实主要基于解耦和异步来用的,较少在大规模吞吐的场景下使用 rabbitMQ: 吞吐量万级 跟服务器有关系 基于erlang开发,性能较好 延时低,而且提供开源的管理界面 社区比较活跃,近些年互联网公司用rabbitmq的比较多,因为基于erlang语言 不懂源码,比较难进行定制和掌控; rocketMQ:单机吞吐量10w,topic可以达到几百或者上千级别 topic越多吞吐量会有较小幅度的下降,阿里大规模使用,比较可靠、日处理消息上百亿、拓展方便、社区维护可以,只会复杂MQ业务场景 kafka:功能简单,主要支持简单的mq功能,ms级延迟 极高的可用性和可靠性不过有消息重复消费 在大数据领域的实时计算以及日志采集被大规模使用。 中小型公司:rabbitMQ,技术实力一般 挑战不是很高 社区比较活跃; 大型公司:rocketMQ 基础架构研发实力较强 如果是大数据领域的实时计算、日志采集等场景

消息中间件---RabbitMQ入门2---消息传递模式

我是研究僧i 提交于 2019-11-30 22:42:20
第二篇我们简单介绍下RabbitMQ的一些消息传递模式: 1、直接模式(Direct) (1)直接模式简介 我们需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。 1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。 2.这种模式下不需要将Exchange进行任何绑定(binding)操作。 3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。 4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。 (2)创建队列 做下面的例子前,我们先建立一个叫itcast的队列。 Durability: 是否做持久化 Durable(持久) transient(临时) Auto delete : 是否自动删除 (3)代码实现---消息生产者 一、创建工程rabbitmq_demo,引入amqp起步依赖 ,pom.xml如下: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐parent</artifactId>

消息中间件-RabbitMQ学习

折月煮酒 提交于 2019-11-30 22:41:59
RabbitMQ安装 docker run -di --name=rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management 登录mq页面,测试安装是否成功: ip:15672 登录账号: guest 密码: guest -学习应该从了解他的工作方式开始 前提: 就是要知道的 交换器 exchange, 队列queue 交换器:用来接收消息, 并分发给哪个队列, 一个或多个 队列: 用来存 消息的, 经过交换器的消息, 就会存到各个队列里, 一个或多个 -两个概念: 生产者: 通过rebbitmq生产消息 一个或多个 消费者: 使用rebbitmq里面的消息 一个或多个 -RabbitMQ模式: 3种, 交换器的不同分发规则 前提:需要在 (rabbitmq的可视化界面 ip:15672 端口 ) 添加一个队列 打开页面后,找到 Queues -> add a new queue中添加, 写队列名字 点击 Add Queue 即可添加 1 直接模式: Direct Exchange 可以理解为, 生产者直接将消息发送给了队列 指的是 交换器里有个 Direct Exchange[名字为 空字符串 ""的交换器],