RabbitMQ

安装rabbitmq时 ERLANG_HOME not set correctly异常

混江龙づ霸主 提交于 2020-02-27 18:49:34
ERLANG_HOME 设置不对。 在rabbitmq的server, sbin下: set ERLANG_HOME=D:\installDev\erl10.2 启动。 如果启动不了,删除erl进程再重新启动 二、常用命令 1. 查看用户列表:rabbitmqctl list_users 2. 新增一个用户:rabbitmqctl add_user bruce 123456 3. 删除一个用户:rabbitmqctl delete_user bruce 4.修改用户密码:rabbitmqctl change_password bruce 654321 5.授予管理员角色:rabbitmqctl set_user_tags bruce administrator 6.授予用户权限:rabbitmqctl set_permissions -p / bruce ".*" ".*" ".*" 来源: CSDN 作者: 千百元 链接: https://blog.csdn.net/liuming690452074/article/details/104539494

2.7 RabbitMQ高级特效-死信队列

依然范特西╮ 提交于 2020-02-27 15:29:56
DLX ,Dead-Letter-Exchange利用DLX,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另外一个Exchange,这个Exchange就是DLX。 消息变成死信有以下几种情况: 1.消息被拒绝(basic.reject/basic.nack)并且requeue=false 2.消息TTL过期。。 3.队列达到最大长度。 DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。 当这个队列中有死信的时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进二被路由到另外一个队列。 可以监听这个队列中消息做相应的处理,这个特性可以弥补RabbitMQ3.0以前支持的immediate参数的功能。 死信队列的设置: 1 首先需要设置死信队列的Exchange和queue,然后绑定: Exchange:dlx.exchange Queue:dlx.queue RoutingKey:# 2 然后进行正常声明交换机、队列、绑定,只不过我们需要在对别加上一个参数即可:arguments.put("x-dead-letter-exchange","dlx.exchange")。这样消息在过期、qequeue、队列达到最大长度时

Spring Boot(七):RabbitMQ 详解

好久不见. 提交于 2020-02-27 13:58:31
一、RabbitMQ简介 RabbitMQ即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 消息中间件在互联网公司的使用中越来越多,消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支持,RPC的调用等等。 RabbitMQ是实现AMQP(高级消息队列)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层保存这个数据。 AMQP,即advanced message queuing protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠安全。 RabbitMQ是一个开源的AMQP实现,服务器用Erlang语言编写,支持多种客户端,如 Python、Ruby、.NET、Java、JMS

如何保证消息的顺序性

女生的网名这么多〃 提交于 2020-02-27 13:06:43
1.为什么要保证顺序 消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常。举例: 比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了 删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。 2.出现顺序错乱的场景 (1)rabbitmq ①一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。 ②一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。 (2)kafka ①kafka一个topic,一个partition,一个consumer,但是consumer内部进行多线程消费,这样数据也会出现顺序错乱问题。 ②具有顺序的数据写入到了不同的partition里面,不同的消费者去消费

docker for rabbitmq

梦想的初衷 提交于 2020-02-27 12:40:33
################################ docker for rabbitmq ################################ 一. 安装rabbitmq 1.1 docker pull rabbitmq:3.7.17-management 1.2 docker run -d --name rabbitmq3.7.17 -p 5672:5672 -p 15672:15672 -v ~/data/rabbitmq:/var/lib/rabbitmq --hostname myRabbit \ -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER= admin -e RABBITMQ_DEFAULT_PASS= admin rabbitmq:3.7.17-management 1.3 #设置权限 rabbitmqctl set_permissions -p my_vhost admin '.*' '.*' '.*' 二. rabbitmq 控制台 2.1 帐号密码:见docker run命令中RABBITMQ_DEFAULT_USER、RABBITMQ_DEFAULT_PASS 2.2 进入控制台 http://IP:15672/ ,需要根据业务需要新建queues

RabbitMQ consumer as a windows service

被刻印的时光 ゝ 提交于 2020-02-27 11:59:27
问题 I have a rabbitmq consumer application implementing "publish/subscribe pattern in .net, which runs perfectly as a console application but when I deploy that as a windows service it does not seem to be saving the data into mongodb. protected override void OnStart(string[] args) { try { var connectionString = "mongodb://localhost"; var client = new MongoClient(connectionString); var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection())

总结:延时任务队列的原理与实现

不想你离开。 提交于 2020-02-27 11:42:45
延时任务有别于定式任务,定式任务往往是固定周期的,有明确的触发时间。而延时任务一般没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件。也就是说,任务事件生成时并不想让消费者立即拿到,而是延迟一定时间后才接收到该事件进行消费。 延迟任务相关的业务场景如下: 场景一:在订单系统中,一个用户某个时刻下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将自动进行过期处理。 场景二:用户某个时刻通过手机远程遥控家里的智能设备在指定的时间进行工作。这时就可以将用户指令发送到延时队列,当指令设定的时间到了再将指令推送到只能设备。 下面我们来探讨一些方案,其实这些方案没有好坏之分,和系统架构一样,只有最适合。对于数据量较小的情况下,任意一种方案都可行,考虑的是简单明了和开发速度,尽量避免把系统搞复杂了。而对于数据量较大的情况下,就需要有一些选择,并不是所有的方案都适合了。 解决方式 定时器轮询遍历数据库记录 JDK的DelayQueue JDK ScheduledExecutorService 时间轮(netty) 利用quartz等定时任务 Redis的ZSet实现 rabbitMq实现延时队列 定时器轮询遍历数据库记录 这是比较常见的一种方式,所有的订单或者所有的命令一般都会存储在数据库中

rabbitmq系列(一)初识rabbitmq

家住魔仙堡 提交于 2020-02-27 08:31:47
为什么要使用消息中间件 案例:假如我们开发了一个商品抢购网站。这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息注册。传统做法应该是这样的。两种方式,并行即启用两个线程,当用户提交信息后,分别去发送邮件和发送短信。这种方式很明显比串行的方式更快。当我们加入消息队列后,处理方式如下图: 加入消息中间件后,我们只需要注册信息存库后,给消息队列中添加一条消息就完事了。然后邮件服务和短信服务分别去消费消息即可。 当用户注册完成后,到了抢购商品的时间,大家都去抢购某个商品的时候这个量很大。消息队列可以设置队列长度来保证系统的稳定性。当队列满了的时候,则不再处理这些用户请求。 因此我们可以总结一下消息队列的特点: 异步处理 -- 用户注册信息提交后,直接返回响应。然后邮件服务和短信服务监听到队列有消息后去主动处理 应用解耦 -- 用户注册流程分成了三个服务,注册服务、邮件服务、短信服务互不干扰。 流量削峰 -- 控制用户请求,以防系统奔溃。 常见消息中间件介绍 ActiveMQ :apache出品,能力强劲的开源消息总线,完全支持jms规范的消息中间件。api丰富,在传统行业的中小型企业中应用广泛。缺点:服务性能和数据存储性能不好。 Kafka :apache顶级项目,追求高吞吐量。一开始的目的是用于日志收集和传输

认识一下 RabbitMQ

♀尐吖头ヾ 提交于 2020-02-27 08:10:03
分布式系统中,如何在各个应用之间高效的进行通信,是系统设计中的一个关键。 使用 消息代理(message broker) 是一个优雅的解决方案。 RabbitMQ 就是一个被广泛应用的消息代理,遵循 AMQP协议 。 接下来我们就了解一下: Message Broker 概念 AMQP 协议的核心构成 消息转发的 4 种模式 1. Message Broker broker 是经纪人的意思,促成卖方、买方的交易,例如房产经纪人。 消息模型中,有消息的生产者、消费者,就相当于卖方、买方。 所以,也需要一个消息经纪人,这就引出了 message broker 的概念。 message broker 从生产者接收消息,再发送给消费者,这样,生产者、消费者可以完全隔离。 RabbitMQ 就是一个 message broker 。 2. AMQP 具体如何传递消息?要看使用的消息协议。 RabbitMQ 支持多种协议,其中最重要的是 AMQP (Advanced Message Queuing Protocol)。 AMQP 的概念模型很简单,包含3个部分: Queue Binding Exchange 当一个消息发布到 RabbitMQ 后,首先到达 Exchange,然后 Exchange 把消息分配给 Queue,消费者从 Queue 中得到消息。 AMQP 是一个可编程的协议

rabbitmq系列(三)消息幂等性处理

这一生的挚爱 提交于 2020-02-27 06:51:06
一、springboot整合rabbitmq 我们需要新建两个工程,一个作为生产者,另一个作为消费者。在pom.xml中添加amqp依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在application.yml文件中添加rabbitmq的相关信息: spring: rabbitmq: # 连接地址 host: 127.0.0.1 # 端口 port: 5672 # 登录账号 username: guest # 登录密码 password: guest # 虚拟主机 virtual-host: / 在生产者工程中新建配置项rabbitmqConfig.java,申明名称为”byte-zb“直连交换机和队列,使用”byte-zb“的routing-key将队列和交换机绑定,代码如下: @Configuration public class RabbitConfig { public static final String QUEUE_NAME = "byte-zb"; public static final String EXCHANGE_NAME = "byte-zb";