отправка фрагмента кода в сообщении

#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) использовать аналогичным образом.