当前位置: 首页 > 面试题库 >

互操作性Azure Service Bus消息队列消息

宋勇
2023-03-14
问题内容

我有一个Java App和一个NodeJS App,它们都使用一个Azure Service Bus消息队列。

我看到与客户产生一些奇怪的影响,如下所示。

JAVA MESSAGE PRODUCER(每个Azure JMS教程使用QPID库):

 TextMessage message = sendSession.createTextMessage();
        message.setText("Test AMQP message from JMS");
        long randomMessageID = randomGenerator.nextLong() >>>1;
        message.setJMSMessageID("ID:" + randomMessageID);
        sender.send(message);
        System.out.println("Sent message with JMSMessageID = " + message.getJMSMessageID());

输出:发送的邮件的JMSMessageID = ID:2414932965987073843

NODEJS消息消费者:

serviceBus.receiveQueueMessage(queue, {timeoutIntervalInS: timeOut, isReceiveAndDelete: true}, function(err, message) {
if(message !==null)console.log(util.inspect(message, {showHidden: false, depth: null}));
});

输出:

{ body: '@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/�\u001aTest AMQP message from JMS',
brokerProperties:
{ DeliveryCount: 1,
EnqueuedSequenceNumber: 5000004,
EnqueuedTimeUtc: 'Wed, 04 Nov 2015 21:28:21 GMT',
MessageId: '2414932965987073843',
PartitionKey: '89',
SequenceNumber: 59672695067659070,
State: 'Active',
TimeToLive: 1209600,
To: 'moequeue' },
contentType: 'application/xml; charset=utf-8' }

如果将其与通过serviceBus.sendQueueMessage()插入队列中的消息进行比较,则属性如下所示:

{ body: 'test message',
brokerProperties:
{ DeliveryCount: 1,
EnqueuedSequenceNumber: 0,
EnqueuedTimeUtc: 'Wed, 04 Nov 2015 21:44:03 GMT',
MessageId: 'bc0a3d4f-15ba-434f-9fb0-1a3789885f8c',
PartitionKey: '734',
SequenceNumber: 37436171906517256,
State: 'Active',
TimeToLive: 1209600 },
contentType: 'text/plain',
customProperties:
{ message_number: 0,
sent_date: Wed Nov 04 2015 21:44:03 GMT+0000 (UTC) } }

因此内容类型从一开始就不同-为什么?-然后第一个消息有效内容的主体中的奇怪垃圾来自 何处@ \ u0006string \
b3http://schemas.microsoft.com/2003/10/Serialization/。\ u001a

这是序列化的结果吗?如何缓解这种情况?

在此处也找到代码:http :
//pastebin.com/T9RTFRBk


问题答案:

Azure服务总线支持两种不同的协议:AMQP和HTTP。使用qpid库的Java /
JMS将AMQP协议用于ServiceBus。但是,NodeJS通过HTTP协议包装了ServiceBus REST API。

有关Service Bus中AMQP支持的详细信息,请参阅https://azure.microsoft.com/zh-
cn/documentation/articles/service-bus-amqp-
overview/。

对于ServiceBus的REST API,请参阅https://msdn.microsoft.com/en-
us/library/azure/hh780717.aspx。

AMQP是二进制的应用程序层协议,旨在有效地支持各种消息传递应用程序和通信模式。-
来自WikiPedia

但是HTTP是文本协议。

消息格式如下,请参阅Message Formataritifact 的部分:http: //docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-
messaging-v1.0-os.html #section-message-format。而且AMQP规范可以参考html" target="_blank">http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-
overview-v1.0-os.html。

                                                     Bare Message
                                                            |
                                      .---------------------+--------------------.
                                      |                                          |
 +--------+-------------+-------------+------------+--------------+--------------+--------+
 | header | delivery-   | message-    | properties | application- | application- | footer |
 |        | annotations | annotations |            | properties   | data         |        |
 +--------+-------------+-------------+------------+--------------+--------------+--------+
 |                                                                                        |
 '-------------------------------------------+--------------------------------------------'
                                             |
                                      Annotated Message

因此,以Java发送或以NodeJS发送的消息被序列化为不同的结果。

\uXXXXAMQP正文内容中格式化的内容是Unicode Charater。

Unicode字符\u0006是Acknowledge控制字符,请参阅https://en.wikipedia.org/wiki/Acknowledge_character来了解。

Unicode字符\u001a是替代控制字符,请参阅https://en.wikipedia.org/wiki/Substitute_character。

它们限制了消息头中元数据的开始和结束。



 类似资料:
  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *

  • 消息队列接口 结构体 struct   rt_messagequeue   消息队列控制块 更多...   类型定义 typedef struct rt_messagequeue *  rt_mq_t   消息队列类型指针定义   函数 rt_err_t  rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_

  • rabbitmq 使用 定义handler实体 public class UserEvent : EventHandler { public string Name { get; set; } public string Job { get; set; } } 队列定义 [QueueConsumer(nameof(HelloEventHandler), QueueCon

  • 主要内容:什么是Stream?,常用命令汇总,基本命令应用,创建消息ID,创建消费组,消费消息Redis Stream 是 Redis 5.0 版本引入的一种新数据类型,同时它也是 Redis 中最为复杂的数据结构,本节主要对 Stream 做相关介绍。 什么是Stream? Stream 实际上是一个具有消息发布/订阅功能的组件,也就常说的消息队列。其实这种类似于 broker/consumer(生产者/消费者)的数据结构很常见,比如 RabbitMQ 消息中间件、Celery 消息中间