通过 Python 对消息队列协议和 ActiveMQ 使用的简短分析

233 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情

消息分发是许多应用程序中的一个关键主题,针对现有问题选择哪种通信协议很重要。ActiveMQ(活动消息队列)只是许多其他消息队列系统之一。 在本教程中,本文的重点是对ActiveMQ进行简要分析,并分享其与其他同类通信协议的特点,最后搭建一个简单的ActiveMQ测试环境。为了实现它,应该执行以下步骤:

  1. ActiveMQ分析及其与其他协议的比较
  2. 在 Mac OSX 上安装 Active MQ
  3. 在 Python 中创建消费者和生产者代码

一、ActiveMQ分析及与其他协议的比较

ActiveMQ 在学术界也得到了很好的研究。本研究[1]比较了RabbitMQ和代理托管在 AWS 上的 ActiveMQ 在不同消息负载和队列大小下的延迟、发布率、数据率和消费率。ActiveMQ 总体上优于RabbitMQ。这项工作[2]发现 ActiveMQ 在接收客户端发送给代理的消息时速度更快,而 RabbitMQ 在客户端从代理接收消息时效率更高。这项工作的目的是找出最适合用例的 AMQP(高级消息队列协议)协议。上篇文章[3]比较比较重要的消息队列协议涉及KafkaRabbitMQRocketMQ、 ActiveMQ 和Pulsar考虑了各种特性,例如生产特性、QoS 保证视角、性能和功能视图。本研究的评估结果如下表。

image.png

最终结果表明,RocketMQ提供了更低的延迟,而 Kafka 支持更高的吞吐量。与上一篇文章一样,协议的选择将根据应用需求进行指定。例如,如果应用程序需要低延迟和对 QoS(服务质量)的强度要求,RocketMQ 可能是一个不错的选择。如果日志消息、大数据或流处理等大量数据或消息是用例,那么 Kafka 的效率可能会高得多。作为同一篇论文的最后评论,它强调了Pulsar与其他通信协议相比的一些独特功能。

以防万一,其他通信协议(例如DDSZeroMQ) 以及它们与本研究中的 MQTT 的比较感兴趣[4],这些协议针对不同的物联网数据流量条件进行了测试。

2.在Mac OSX上安装ActiveMQ

通过 homebrew 安装 activeMQ

brew install activemq

ActiveMQ安装后无法自动启动,下面两条命令会先启动它,然后列出它的状态

brew services start activemq  
brew services

image.png

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 的简单实现。