rabbitmq消息阻塞如何解决

rabbitmq消息阻塞如何解决,第1张

按照JMS规范,为了保证可靠性,所有的消息都应该是发送到broker,然后交由broker来投递的。也即是说其实JMS是不建议或不支持传输文件的。

对于比较小的文件,简单的处理方式是先读取所有的文件成byte[],然后使用ByteMessage,把文件数据发送到broker,像正常的message一样处理。对于大文件,例如1GB以上的文件,这么搞直接把client或是broker给oom掉了。

这种方式仅仅适用于小文件的传输。特别是如果broker端使用数据库作为存储,message序列化以后存放于blob字段,文件传输频繁或是稍微有点大,写入效率极低。

直接传输文件

为了解决传输大文件的问题,ActiveMQ在jms规范之外引入了jms streams的概念。PTP模式下,连到同一个destination的两端,可以通过broker中转来传输大文件。

发送端使用connectioncreateOutputStream打开一个输出流,往流里写文件。

OutputStream out =connectioncreateOutputStream(destination);

接收端则简单的使用connectioncreateInputStream拿到一个输入流,从中读取文件数据即可。

InputStream in = connectioncreateInputStream(destination)

rabbitmqctl管理工具的使用标准格式为:rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options]

其中-n -t -q为管理工具的参数,

-n 指定节点默认为rabbit@server,即所有的命令都是在这个节点上执行的;

-q 为安静输出模式;

-t 设置超时时间,该参数只对list相关的命令适用,默认为无穷大。

以上三个参数一般很少用到,只有在集群管理时可以指定节点非常有用,如不是运维人员,只是为了开发方便,一般选择默认就足够了。

rabbitmqctl提供了非常丰富的connmand,下面将会对相对常用的一些命令分组进行介绍,当然也包括使用时应该注意的一些事项。

(1)、关于user的一些命令

add_user <username> <password> 添加一个用户,需要指定用户名和密码;

delete_user <username>删除一个用户,只需指定用户名;

change_password <username> <newpassword>修改指定用户的密码;

clear_password <username>删除密码;

set_user_tags <username> <tag> 设置用户角色,执行命令时会清空原有角色,角色可以设置多个或零个;

list_users列出所有已经存在的用户;

注:

rabbitmq的角色有以下几种:

none、management、policymaker、monitoring、administrator

none

不能访问 management plugin

management

用户可以通过AMQP做的任何事外加:

列出自己可以通过AMQP登入的virtual hosts

查看自己的virtual hosts中的queues, exchanges 和 bindings

查看和关闭自己的channels 和 connections

查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。

policymaker

management可以做的任何事外加:

查看、创建和删除自己的virtual hosts所属的policies和parameters

monitoring

management可以做的任何事外加:

列出所有virtual hosts,包括他们不能登录的virtual hosts

查看其他用户的connections和channels

查看节点级别的数据如clustering和memory使用情况

查看真正的关于所有virtual hosts的全局的统计信息

administrator

policymaker和monitoring可以做的任何事外加:

创建和删除virtual hosts

查看、创建和删除users

查看创建和删除permissions

关闭其他用户的connections

( 2)、虚拟机和权限

add_vhost <vhostpath> 添加一个虚拟机如:rabbitmqctl add_vhost myvhost

注:虚拟机的第一个字符最好不要为 “ / “,在用url方式建立连接时要是指定虚机要用 /vhostName的方式指 定,容易引起误解,如果虚机名为/myvhost 则使用时就会变成//myvhost。

delete_vhost <vhostpath> 删除一个虚拟机

list_vhosts [<vhostinfoitem> ] 打印出虚拟机列表

set_permissions [-p <vhostpath>] <user> <conf> <write> <read> 为user设置进入虚拟机的权限,如果不指定虚 拟主机则默认为/

注:在执行该命令时,在windows下 <user> <conf> <write> <read>四个参数都不要加引号,如:

rabbitmqctl set_permissions -p myvhost userName 不能写成

rabbitmqctl set_permissions -p myvhost userName ‘’‘’‘’

各个字段的含义将在下篇文章中介绍

clear_permissions [-p <vhostpath>] <username>删除指定用户进入指定虚拟机的权限,默认虚拟主机为 /

list_permissions [-p <vhostpath>] 列出具有进入指定虚拟主机权限的用户列表,

列表格式为:userName conf write read

list_user_permissions <username>列出指定用户所具有的进入虚拟主机权限的虚拟主机的列表 ,

列表格式为:vhostName conf write read

(3)、其他常用命令

list_queues [-p <vhostpath>] [<queueinfoitem> ] 打印消息队列列表

list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ] 打印交换机列表

list_bindings [-p <vhostpath>] [<bindinginfoitem> ] 打印绑定器列表

list_connections [<connectioninfoitem> ] 打印l连接列表

list_channels [<channelinfoitem> ]打印消费者列表

生产者先将消息投递一个叫队列的容器中,然后再从这个容器中取出消息,最后再转发给消费者。

消息队列是 Microsoft 的消息处理技术,它在任何安装 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。

消息队列网络是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。

消息队列的类型介绍:

消息队列目前主要有两种类型:POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该消息队列的大量信息。包括消息队列键值、用户ID、组ID、消息队列中消息数目等等。

消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。

mnesia提供了多种方式把表复制到多个不同的Erlang节点上。编程人员除表名不用关心表的具体在那个节点上。实现具体位置透明化。(当然如果数据在远程节点,处理会慢一点), 数据库可以反复配置, 表可以在节点间移动。这并不影响编程人员。

以下是创建一个表,带有两个复件:

mnesia:create_table(foo,

[{ram_copies, [N1, N2]},

{attributes, record_info(fields, foo)}])

使用springboot,实现以下功能,有两个队列1、2,往里面发送消息,如果处理失败发生异常,可以重试3次,重试3次均失败,那么就将消息发送到死信队列进行统一处理,例如记录数据库、报警等

完整demo项目代码>

将异步通信用于微服务的场合,通常使用消息代理(Message Broker)。消息代理确保不同微服务之间的通信可靠稳定,保证消息在系统内得到管理和监视,并且消息不会被丢失。

开发者可以选择的一些消息代理有很多,它们的规模和数据功能各不相同。本篇文章将比较三种最受欢迎的消息代理:RabbitMQ,Kafka与Redis。

首先让我们了解微服务通信。

在微服务之间有常见的两种通信方式:同步与异步。

在同步通信中,调用方在发送下一条消息之前等待响应,并且它作为>

用消息队列更新缓存原因:

1、通过消息队列将更新缓存 *** 作串行处理,可以解决并发更新的问题,比如线程A、线程B在并发更新数据库时,利用数据库事务隔离机制避免脏读。

2、然后把数据标识写入消息队列,接下来消费消息队列,再通过数据标识去读取数据库相应数据并刷新缓存。

以上就是关于rabbitmq消息阻塞如何解决全部的内容,包括:rabbitmq消息阻塞如何解决、如何在windows下 修改rabbitmq node name、消息队列(mq)是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9495285.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存