#c# #node.js #msgpack #lz4
#c# #node.js #msgpack #lz4
Вопрос:
У меня есть очередь RabbitMQ и два приложения. Первое приложение написано на .NET Core для генерации отправки полезной нагрузки в очередь, а второе — в Node.js для чтения из очереди.
Приложение-производитель
Я использую MessagePack-CSharp для сериализации и сжатия (LZ4) полезной нагрузки. Вот код сериализации в .NET:
using MessagePack;
namespace uBeac.Serialization
{
public class MessageSerilizer
{
public static byte[] Serialize(object message)
{
MessagePackSerializer.SetDefaultResolver(MessagePack.Resolvers.ContractlessStandardResolver.Instance);
return LZ4MessagePackSerializer.Serialize(message);
}
}
}
Потребительское приложение
Я считываю байты в Node.js используя библиотеку amqplib, как показано ниже:
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://...................', function (err, conn) {
conn.createChannel(function (err, ch) {
var queueName = 'toProcessor';
ch.assertQueue(queueName, { durable: false });
ch.prefetch(1);
console.log(" [*] Waiting for messages in %s. To exit press CTRL C", queueName);
ch.consume(queueName, function (msg) {
var secs = msg.content.toString().split('.').length - 1;
console.log(" [x] Received %s", msg.content.toString());
setTimeout(function () {
console.log(" [x] Done");
ch.ack(msg);
}, secs * 1000);
}, { noAck: false });
});
});
Я попытался десериализовать полезную нагрузку в объект Json, используя некоторые библиотеки MsgPack, такие как messagepack, msgpack-node, … Но, похоже, что они не предоставляют ту же библиотеку в .NET, что я показал выше.
Вопрос: Как я могу распаковать и десериализовать полезную нагрузку в объект Json?
Комментарии:
1. Если вы сжимаете LZ4 в виде двоичного потока , что заставляет вас думать, что вы можете десериализовать его с помощью библиотеки JSON ?
2. @MickyD Я пытался сделать так, чтобы с помощью #lz4js: lz4.распаковывать (msg.content) , но это выдает throw er; // Необработанное событие ‘error’
3. Тогда, может быть, лучше исправить эту ошибку , чем пытаться что-то, что может вообще не сработать?
4. Ваша
Producer
явно сериализуется в двоичном формате, а вашаConsumer
десериализуется в виде строки . Это не сработает. Мой совет — следовать общим рекомендациям по обмену корпоративными сообщениями и сохранять содержимое вашего сообщения в виде,text
а не двоичном формате, поэтому никакого явного ручного сжатия содержимого. Двоичное кодирование накладывает определенные ограничения на получателя и уменьшает вашу аудиторию, не говоря уже о том, что вы, скорее всего, разобьете потребителей будущими изменениями. Теперь, если это так,text
вы не привязаны к какому-либо одному поставщику для кодирования / декодирования объектов.5. Сериализовать как
text
. Является ли это XML; JSON или что-то еще, зависит от вас