mq服务器信息配置_mqtt服务器配置

hacker|
110

文章目录:

关于ActiveMQ的配备怎么解决

关于ActiveMQ的配置

目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较。简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统。(对于这点我并去调研过MSMQ是否可以部署在非微软系统,比如:Linux,只是拍脑袋想了想,感觉上是不可以)。对于ActiveMQ,微软系统和Linux都是可以部署的。从功能方面来说,一般最常用的就是:消息的收/发,感觉差异不大。从性能上来说,一般的说法是ActiveMQ略高。在稳定性上,个人感觉MSMQ更好。如果这两种常用队列都用过的同学,应该来说最大的差异在于:MSMQ如果要访问远程队列(比如机器A上的程序访问机器B上的队列),会比较恶心。在数据量比较大的情况之下,一般来说队列服务器会专门的一台或者多台(多台的话,用程序去做热备+负载比较方便,也不需要额外的硬件成本。简单来说做法可以这样:消息发送的时候随机向着多台队列服务器上发送消息;接受的时候开多个线程去分别监听;热备方面,可以维护一个带状态的队列连接池,如果消息收发失败那么将状态置为不可用,然后起一个线程去定时监测坏的连接是否可用,这个过程一般情况下可以不用加锁,为什么,大家根据各自需要去取舍吧)。最近搞完了短彩信的网关连接服务,这两种队列我均使用了。大致的过程是这样的:上层应用如果要发端彩信,那么将消息直接发送至ActiveMQ(目前用的就是上面说的多台热备+负载,因为实际中下行量非常大5千万条/天以上),然后端彩信网关连接服务部署多套,每套均依赖本机的MSMQ。为什么呢?用ActiveMQ的原因是:上层应用程序和网关连接服务彼此独立,消息需要跨机访问。用MSMQ的原因是:ActiveMQ中的数据是一条不分省的大队列,网关连接服务需要按省流控,所以端彩信网关连接服务:首先把消息从ActiveMQ取出来,然后存至本机上的分省MSMQ,这样做另外的一个好处就是:ActiveMQ不至于过多挤压,他的数据会分摊到N台短彩信网关连接服务所部署的机器上的MSMQ之中,也就说MSMQ可以起到分摊数据和缓冲的作用。

在之前的随笔中,已经介绍过MSMQ,现在先介绍一下ActiveMQ一些配置,目前好像ActiveMQ配置上的介绍还比较少。以下是自己总结一些相关资料,贴出来给大家共享

一)问题分析和解决

1)KahaDb和AMQ Message Store两种持久方式如何选择?

官方:

From 5.3 onwards - we recommend you use KahaDB - which offers improved scalability and recoverability over the AMQ Message Store.

The AMQ Message Store which although faster than KahaDB - does not scales as well as KahaDB and recovery times take longer.

非官方:

kaha文件系统实际上上是一个文件索引系统,有两部分组成,一个是数据文件系统,由一个个独立的文件组成,缺省文件大小是32M大(可配置),另外一个是索引文件系统,记录消息在数据文件中的位置信息以及数据文件中的空闲块信息。数据文件是存储到硬盘上的,索引文件是缓存在内存中的。所以这个存储系统对大消息存储有利,象我们的memberId之类的文本消息,实际上是浪费,索引比消息还大,哈。

我方分析:

推荐: Amq持久方式

理由:虽然官方推荐使用KahaDB持久方式,但其提到的优势:可伸缩性和恢复性较好,对于我们实际的应用意义不大。从我们自己的使用经验来看,KahaDB持久方式,Data文件是一个大文件(感觉文件过大后,造成队列服务瘫死的可能性会增大),从官网的相关配置(附录1)也找不到哪里可以设置数据的文件的最大Size。)而Amq持久方式可以设置Data文件最大Size,这样可以保证即时消息积压很多,Data文件也不至于过大。

2)错误:Channel was inactive for too long

解决方法:

在建立连接的Uri中加入: wireFormat.maxInactivityDuration=0

参考资源:

You can do the following to fix the issues:

1) Append max inactivity duration to your Uri in the format below: wireFormat.maxInactivityDuration=0

2) Use the same Uri at the client side as well as at the server side

Regards,

如果不这样设置,对应的错误会出现:

2008-05-07 09:22:56,343 [org.apache.activemq.ActiveMQConnection]-[WARN] Async exception with no exception listener: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long: localhost/127.0.0.1:61616

org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long: localhost/127.0.0.1:61616

ActiveMQ的tcp url:tcp://localhost:61616后面要加入?wireFormat.maxInactivityDuration=0 这样的参数,否则当一段时间没有消息发送时会抛出 "Channel was inactive for too long"异常

3)错误:Wire format negotiation timeout: peer did not send his wire format.

解决方法:

1)关闭ActiveMqLog4j

打开:conf/log4j.properties

将:log4j.rootLogger=INFO, console, logfile

修改为:log4j.rootLogger=OFF

2)在建立连接的Uri中加入: maxInactivityDurationInitalDelay=30000

例如北京的测试环境连接Uri:

tcp://192.168.199.80:61616?wireFormat.maxInactivityDuration=0maxInactivityDurationInitalDelay=30000connection.AsyncSend=true

参考资源:

If you get exception like this,it can mean one of three things:

1. You're connecting to the port not used by ActiveMQ TCP transport

Make sure to check that you're connecting to the appropriate host:port

2. You're using log4j JMS appender and doesn't filter out ActiveMQ log messages

Be sure to read How do I use log4j JMS appender with ActiveMQ and more importantly to never send ActiveMQ log messages to JMS appender

3. Your broker is probably under heavy load (or network connection is unreliable), so connection setup cannot be completed in a reasonable time

If you experience sporadic exceptions like this, the best solution is to use failover transport, so that your clients can try connecting again if the first attempt fails. If you're getting these kind of exceptions more frequently you can also try extending wire format negotiation period (default 10 sec). You can do that by using wireFormat.maxInactivityDurationInitalDelay property on the connection URL in your client.

For example

tcp://localhost:61616?wireFormat.maxInactivityDurationInitalDelay=30000

will use 30 sec timeout.(貌似有问题!!!)

4)错误:Out of memory

解决方法:

1) 设置Java最大内存限制为合适大小:

Bin/activemq.bat 中ACTIVEMQ_OPTS=-Xmx512M(默认是512)

2)Activemq.xml配置节:systemUsage/ systemUsage配置大小合适,并且特别注意:大于所有durable desitination设置的memoryUsage之和。

备注:

1)尖括号:“”代表通配符

2)ACTIVEMQ_OPTS的配置〉=memoryUsage中配置〉=所有durable desitination设置之和

3)SystemUsage配置设置了一些系统内存和硬盘容量,当系统消耗超过这些容量设置时,amq会“slow down producer”,还是很重要的。

参考资料:

参考--

对于MQ的内容实用是可管理和可配置的。首先需要判断的是MQ的哪部分系统因内存不足而导致泄漏,是JVM,broker还是消费者、生产者?

一、内存管理

JVM内存管理:

1. 用bin/activemq命令在独立JVM中运行broker。用-Xmx和-Xss命令即可(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可);

2. 默认情况下,MQ用512M的JVM;

broker内存管理:

1. broker使用的内存并不是由JVM的内存决定的。虽然受到JVM的限制,但broker确实独立管理器内存;

2. systemUsage和destination的内存限制与broker内存息息相关;

3. MQ中内存的关系是:JVM-Broker-broker features;

4. 所有destination的内存总量不能超过broker的总内存;

消费者:

1. 由于消息大小可以配置,prefetch limit往往是导致内存溢出的主要原因;

2. 减少prefetch limit的大小,会减少消费者内存中存储的消息数量;

生产者:

1. 除非消息数量超过了broker资源的限制,否则生产者不会导致内存溢出;

2. 当内存溢出后,生产者会收到broker的阻塞信息提示;

二、其他

将消息缓冲之硬盘:

1. 只有当消息在内存中存储时,才允许消息的快速匹配与分发,而当消费者很慢或者离开时,内存可能会耗尽;

2. 当destination到达它的内存临界值时,broker会用消息游标来缓存非持久化的消息到硬盘。

3. 临界值在broker中通过memoryUsage和systemUsage两个属性配置,请参考activemq.xml;

4. 对于缓慢的消费者,当尚未耗尽内存或者转变为生产者并发控制模式前,这个特性允许生产者继续发送消息到broker;

5. 当有多个destination的时候,默认的内存临界值可能被打破,而这种情况将消息缓存到硬盘就显得很有意义;

6. precentUsage配置:使用百分比来控制内存使用情况;

多个线程:

1. 默认情况下,MQ每个destination都对应唯一的线程;

2. -Dorg.apache.activema.UseDedicatedTaskRunner=false(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可),用线程池来限制线程的数量,从而减少内存消耗;

大数据传输:

1. destination policies--maxPageSize:控制进入内存中的消息数量;lazyDispatch:增加控制使用当前消费者列表的预取值;

2. 使用blogMessage或者streamsMessage类型来进行大量文件的传输;

泄漏JMS资源:

1. 当session或者producer或者consumer大量存在而没有关闭的时候;

2. 使用PooledConnectionFactory;

请教MQ SERVER to MQ SERVER配置方法

比如有 A B 两个server, A B 两个server上面分别有 QM_A 和 QM_B 两个队列管理器, 假设 A 是发送方,B 是接收方,那么先在B端建立一个接收方通道, 然后在A 端建立一个传输队列,这个队列有参数指向B端的(IP 地址,端口号,队列管理器), 传输队列创建完之后在A端再建立一个发送方通道,注意这个发送方通道的名称一定要和B接受通道的名称一样的,在建立A端发送通道的时候指定之前建立的传输队列,接下来在B端建立两个本地队列用来接受消息的,里面有属性可以设置接受的消息的持久的还是非持久的, 完了之后在A端建立两个远程队列,远程队列里面会有属性让你指向到B端的本地队列的(传输队列,队列管理器名字,本地队列名字等),完后之后在A端建立两个别名队列分别指向那两个远程队列,配置完成,启动发送方通道,他会自动建立和接收方的连接,完后之后就可以测试一下了,在A端的别名队列里面放测试消息,你会发现消息会路由到B端的本地队列里面。

rabbitmq服务怎样配置调用本地

AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件 (MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一 部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。

AMQP当中有四个概念非常重要

virtual host,虚拟主机

exchange,交换机

queue,队列

binding,绑定

一个虚拟主机持有一组交换机、队列和绑定。

为什么需要多个虚拟主机呢?因为RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机/。

何谓虚拟主机(virtual host),交换机(exchange),队列(queue)和绑定(binding)

队列(Queues)是你的消息(messages)的终点,可以理解成装消息的容器。消息就一直在里面,直到有客户端(也就是消费者,Consumer)连接到这个队列并且将其取走为止。不过,也可以将一个队列配置成这样的:一旦消息进入这个队列,此消息就被删除。

队列是由消费者(Consumer)通过程序建立的,不是通过配置文件或者命令行工具。这没什么问题,如果一个消费者试图创建一个已经存在的队列,RabbitMQ会直接忽略这个请求。因此我们可以将消息队列的配置写在应用程序的代码里面。

而要把一个消息放进队列前,需要有一个交换机(Exchange)。

交换机(Exchange)可以理解成具有路由表的路由程序。每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字符串。交换机当中有一系列的绑定(binding),即路由规则(routes)。(例如,指明具有路由键 “X” 的消息要到名为timbuku的队列当中去。)

消费者程序(Consumer)要负责创建你的交换机。交换机可以存在多个,每个交换机在自己独立的进程当中执行,因此增加多个交换机就是增加多个进程,可以充分利用服务器上的CPU核以便达到更高的效率。例如,在一个8核的服务器上,可以创建5个交换机来用5个核,另外3个核留下来做消息处理。类似的,在RabbitMQ的集群当中,你可以用类似的思路来扩展交换机一边获取更高的吞吐量。

交换机如何判断要把消息送到哪个队列?你需要路由规则,即绑定(binding)。一个绑定就是一个类似这样的规则:将交换机“desert(沙漠)”当中具有路由键“阿里巴巴”的消息送到队列“hideout(山洞)”里面去。换句话说,一个绑定就是一个基于路由键将交换机和队列连接起来的路由规则。例如,具有路由键“audit”的消息需要被送到两个队列,“log-forever”和“alert-the-big-dude”。要做到这个,就需要创建两个绑定,每个都连接一个交换机和一个队列,两者都是由“audit”路由键触发。在这种情况下,交换机会复制一份消息并且把它们分别发送到两个队列当中。交换机不过就是一个由绑定构成的路由表。

交换机有多种类型。他们都是做路由的,但是它们接受不同类型的绑定。为什么不创建一种交换机来处理所有类型的路由规则呢?因为每种规则用来做匹配分子的CPU开销是不同的。例如,一个“topic”类型的交换机试图将消息的路由键与类似“dogs.*”的模式进行匹配。匹配这种末端的通配符比直接将路由键与“dogs”比较(“direct”类型的交换机)要消耗更多的CPU。如果你不需要“topic”类型的交换机带来的灵活性,你可以通过使用“direct”类型的交换机获取更高的处理效率。

如何配置rabbitmqtt服务器的ip地址

RabbitMQ Server安装

################################################

1.安装Erlang

sudo yum install erlang

2.安装RabbitMQ Server

需要先导入key

sudo rpm --import

可先将内容保存至文本文件,如,rabbitmq-signing-key-public.asc.txt

sudo rpm --import rabbitmq-signing-key-public.asc.txt

3.安装rabbitmq-server-3.4.1-1.noarch.rpm

sudo yum install rabbitmq-server-3.4.1-1.noarch.rpm

4.启动RabbitMQ Server

注册为系统服务

sudo chkconfig rabbitmq-server on

启动RabbitMQ Server

sudo /etc/init.d rabbitmq-server stop/start/etc

sudo service rabbitmq-server stop/start/etc

5.若启动失败检测端口是否被占用

4369 (epmd), 25672 (Erlang distribution)

5672, 5671 (AMQP 0-9-1 without and with TLS)

15672 (if management plugin is enabled)

61613, 61614 (if STOMP is enabled)

1883, 8883 (if MQTT is enabled)

activemq 一台服务器如何配置多个broker

步骤如下:

1、把整个conf文件夹复制一份,比如叫conf2

2、修改里面的activemq.xml文件

①brokerName不能和原来的重复

②数据存放的文件名称不能重复,比如kahaDB directory = "${activemq.data}/kahadb2"/

③所有涉及的transportConnector的端口,都要和原来的不一样。注意不要超出端口的范围(0-65535)

3、修改jetty.xml,把里面的默认端口号8161改成别的,不如9161

4、到bin下面,复制一个activemq,比如叫activemq2

①修改程序的id,不能和原来的重复,ACTIVEMQ_PIDFILE="$ACTIVEMQ_DATA/activemq2.pid"

②修改配置文件路径ACTIVEMQ_CONF="$ACTIVEMQ_BASE/conf2"

③修改端口,tcp://localhost:61616把61616改成和activemq.xml里面的tcp端口一致。请注意,在activemq5.9.0版本中是这么修改。但我使用的是最新的5.12.1版本,在activemq中找不到该tcp端口的配置,折腾了半天才发现该版本把这个配置挪到了env文件。所以就需要拷贝一份env,比如就叫env2吧,然后再env2里面把61616改成和activemq.xml里面的tcp端口一致。最后别忘了把activemq2里面对env的引用改成env2。ACTIVEMQ_CONFIGS="/etc/default/activemq $HOME/.activemqrc $ACTIVEMQ_HOME/bin/env2"

现在你可以到activemq的bin目录下分别执行./activemq start 和 ./activemq2 start 了。这两个broker服务应该能正常启动了。

如何搭建rabbitmq服务器

1、安装

在Mac下安装RabbitMQ是非常简单的,一般默认RabbitMQ服务器依赖的Erlang已经安装,只需要用下面两个命令就可以完成RabbitMQ的安装(前提是homebrew已经被安装):

?

brew update

brew install rabbitmq

安装完成后需要将/usr/local/sbin添加到$PATH,可以将下面这两行加到~/.bash_profile或者~/.profile:

# RabbitMQ Config

export PATH=$PATH:/usr/local/sbin

在Windows下安装稍微麻烦些,需要先安装ErLang,然后下载RabbitMQ可执行文件安装

2、启动RabbitMQ服务

上面配置完成后,需要关闭终端窗口,重新打开,然后输入下面命令即可启动RabbitMQ服务:

rabbitmq-server!

可以在后面加-detatched选项参数表示以守护进程方式启动

3条大神的评论

  • avatar
    访客 2022-07-22 上午 04:13:27

    立,消息需要跨机访问。用MSMQ的原因是:ActiveMQ中的数据是一条不分省的大队列,网关连接服务需要按省流控,所以端彩信网关连接服务:首先把消息从Activ

  • avatar
    访客 2022-07-22 上午 04:17:22

    of three things:1. You're connecting to the port not used by ActiveMQ TCP transportMake sure to check that you're connecting

  • avatar
    访客 2022-07-22 上午 05:38:31

    atedTaskRunner=false(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可),用线程池来限制线程的数量,从而减少内存消耗; 大数据传输:

发表评论