#java #python #jms #message #amqp
#java #python #jms #Сообщение #amqp
Вопрос:
Я не уверен, что это разумно, но отправка фрагмента кода через message (AMQP, JMS, ZeroMQ) имеет большой смысл в некоторой ситуации.
Обычно мы используем сообщение как простые данные, которые представляют собой информацию, состоящую из примитивов (например, целое число, длина, строка …). Проблема простых данных заключается в том, что они не могут представлять логику. Например, у меня есть сообщение типа
class OperationMsg {
String conditionA;
String conditionB;
String conditionC;
}
Служба A отправляет это сообщение другим службам, чтобы дать им указание выполнить некоторые операции. Поток операций определяется не только условиями, инкапсулированными в сообщении, но и контекстом, который в настоящее время есть у служб. Затем каждая служба должна жестко закодировать, например:
if (msg.conditionA == something amp;amp; self.context.someContext == something) {
doSomethingA();
} else if (msg.conditionB == somethind amp;amp; msg.conditionA != something amp;amp; self.context.sometContext == something) {
doSomethingB();
}
Если мы хотим отделить этот код от службы, мы должны использовать некоторый шаблон посетителя (GoF), однако это невозможно, поскольку мы общаемся через message, и каждая служба может находиться в разных процессах или машинах.
Итак, я думаю, сможем ли мы отправить код в сообщении, который будет похож на шаблон посетителя, но через сообщение. Для динамического языка, такого как Python, это выполнимо из-за функции eval(), для статического языка, такого как Java, это намного сложнее, и я подумываю об использовании какого-нибудь языка выражений.
Тем не менее, я не уверен, что эта идея звучит странно, пожалуйста, не стесняйтесь делиться своими мыслями.
Комментарии:
1. Я звучу разумно, но опасно — кто-то может отправить вредоносный код.
Ответ №1:
Я бы не рекомендовал представлять логику внутри полезной нагрузки сообщения. Существует вероятность возникновения проблем с внедрением кода, и кажется, что было бы сложнее представлять логику внутри сообщения в произвольной форме с точки зрения SCM и т. Д.
Вы можете представить логику на более высоком уровне — до определенной точки — с помощью ключа маршрутизации.
т. е. Вы можете включить общий тип внутри ключа маршрутизации, и тогда ваш код сможет проанализировать ключ маршрутизации и соответствующим образом обработать логику. Таким образом, сообщение влияет на логику, но само по себе не содержит фактической логики.
Комментарии:
1. Добавляя к этому, есть также свойство content-type для сообщений, которое можно (ab) использовать аналогичным образом.