Как сервисы, написанные на JAVA, могут общаться с брокером zeromq, написанным на C

Я написал брокер запрос-ответ, используя zeromq и язык программирования C. Посредник направляет клиентские запросы соответствующим службам, а затем направляет ответ обратно клиенту. Услуги написаны на JAVA.

Может кто-нибудь объяснить, как сервисы взаимодействуют с брокером. Я уверен, что это должен быть распространенный сценарий, но у меня нет большого опыта, поэтому кто-то может помочь мне сделать мой код совместимым.

Пожалуйста, примите во внимание, что службы не будут знать о нуле. Нужно ли использовать node.js в таком сценарии? Придется ли мне писать http-интерфейс?

1 ответ

Вот один из способов сделать это, используя асинхронные сокеты PUSH/PULL. Я псевдо-кодирую это, поэтому заполняйте пробелы сами:

Предполагая, что Java-сервисы находятся в POJO в своем собственном процессе, скажем, у нас есть простой сервис без зависимостей zmq:

public class MyJavaService{
   public Object invokeService(String params){
   }
}

Теперь мы создаем слой делегата Java, который получает сообщения от посредника, делегируя запросы к методам службы Java и возвращая ответ в отдельный сокет:

//receive on this
Socket pull = ctx.createSocket(ZMQ.PULL)
pull.connect("tcp://localhost:5555")

//respond on this
Socket push = ctx.createSocket( ZMQ.PUSH)
psuch.connect("tcp://localhost:5556")

while( true){
  ZMsg msg = pull.recvMsg( pull)

  //assume the msg has 2 frames,
  //one for service to invoke,
  //the other with arguments
  String svcToInvoke = msg.popString()
  String svcArgs = msg.popString()

  if( "MyJavaService".equals(svcToInvoke)){
    ZMsg respMsg = new ZMsg()
    respMsg.push( (new MyJavaService()).invokeService( svcArgs))
    respMsg.send( push)
  }
 }

Со стороны брокера, просто создайте сокеты PUSH/PULL для связи со слоем Java-сервисов (я не программист на C++, так что извините)

int main () {
    zmq::context_t context(1);

    zmq::socket_t push(context, ZMQ_PUSH);
    push.bind( "tcp://localhost:5555");

    // First allow 0MQ to set the identity
    zmq::socket_t pull(context, ZMQ_PULL);
    pull.bind( "tcp://localhost:5556");

    //code here to handle request/response,
    //to clients
    ..
}

Использование PUSH/PULL работает для этого подхода, но идеальным подходом является использование ROUTER на сервере и DEALER на клиенте для полной асинхронной связи, пример здесь.

Надеюсь, поможет!

Другие вопросы по тегам