开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情
消息分发是许多应用程序中的一个关键主题,针对现有问题选择哪种通信协议很重要。ActiveMQ(活动消息队列)只是许多其他消息队列系统之一。 在本教程中,本文的重点是对ActiveMQ进行简要分析,并分享其与其他同类通信协议的特点,最后搭建一个简单的ActiveMQ测试环境。为了实现它,应该执行以下步骤:
- ActiveMQ分析及其与其他协议的比较
- 在 Mac OSX 上安装 Active MQ
- 在 Python 中创建消费者和生产者代码
一、ActiveMQ分析及与其他协议的比较
ActiveMQ 在学术界也得到了很好的研究。本研究[1]比较了RabbitMQ和代理托管在 AWS 上的 ActiveMQ 在不同消息负载和队列大小下的延迟、发布率、数据率和消费率。ActiveMQ 总体上优于RabbitMQ。这项工作[2]发现 ActiveMQ 在接收客户端发送给代理的消息时速度更快,而 RabbitMQ 在客户端从代理接收消息时效率更高。这项工作的目的是找出最适合用例的 AMQP(高级消息队列协议)协议。上篇文章[3]比较比较重要的消息队列协议涉及Kafka、RabbitMQ、RocketMQ、 ActiveMQ 和Pulsar考虑了各种特性,例如生产特性、QoS 保证视角、性能和功能视图。本研究的评估结果如下表。
最终结果表明,RocketMQ提供了更低的延迟,而 Kafka 支持更高的吞吐量。与上一篇文章一样,协议的选择将根据应用需求进行指定。例如,如果应用程序需要低延迟和对 QoS(服务质量)的强度要求,RocketMQ 可能是一个不错的选择。如果日志消息、大数据或流处理等大量数据或消息是用例,那么 Kafka 的效率可能会高得多。作为同一篇论文的最后评论,它强调了Pulsar与其他通信协议相比的一些独特功能。
以防万一,其他通信协议(例如DDS、ZeroMQ) 以及它们与本研究中的 MQTT 的比较感兴趣[4],这些协议针对不同的物联网数据流量条件进行了测试。
2.在Mac OSX上安装ActiveMQ
通过 homebrew 安装 activeMQ
brew install activemq
ActiveMQ安装后无法自动启动,下面两条命令会先启动它,然后列出它的状态
brew services start activemq
brew services
3. 在 Python 中创建消费者和生产者代码
Python stom.py 简化了 ActiveMQ 协议的使用,使我们能够在几行代码中创建消息生产者和消费者。安装stom.py后如下图:
pip3 install stomp.py
,下面首先介绍消息生产者,然后给出消息消费者的代码。
消息生产者
import stomp
user = "admin"
password = "password"
host = "localhost"
port = 61613
destination = "/topic/event-name"
messages = 20
data = "Hello from Publisher"
conn = stomp.Connection(host_and_ports=[(host, port)])
conn.connect(login=user, passcode=password, wait=True)
conn.send(body="Message start", destination=destination)
for i in range(0, messages):
conn.send(body=data, destination=destination)
conn.send(body="Shutdown", destination=destination)
conn.disconnect()
消息消费者(订阅者)
import time
import logging
import stomp
user = "admin"
password = "password"
host = "localhost"
port = 61613
destination = "/topic/event-name"
class Subscriber(object):
def __init__(self, conn):
self.conn = conn
self.count = 0
self.start = time.time()
def on_error(self, message):
logging.error('received an error %s' % message)
def on_message(self, message):
print(message)
if message.body == "Shutdown":
logging.info("Received %s in %f seconds" % (self.count, (time.time() - self.start)))
conn.disconnect()
logging.info("System is being shutted down...")
exit(0)
else:
logging.info('received message: %s' % message)
self.count += 1
conn = stomp.Connection(host_and_ports=[(host, port)])
conn.set_listener('', Subscriber(conn))
conn.connect(login=user, passcode=password)
conn.subscribe(destination=destination, id=1, ack='auto')
print("Waiting for messages...")
while True:
time.sleep(5)
结果
received message:
{cmd=MESSAGE,headers=[{'content-length': '20', 'expires': '0', 'destination': '/topic/event-name', 'subscription': '1', 'priority': '4', 'message-id': 'ID:a.local-57214-1671832494825-3:77:-1:1:21', 'timestamp': '1672180517995'}],body=Hello from Publisher}
总结
本教程的目的是分析以 ActiveMQ 为重点的消息队列协议,并简要反映它们的优缺点。在本文的其余部分,展示了如何安装 ActiveMQ 以及如何使用stomp.py库执行基于 Python 的简单实现。