Как сервисы, написанные на 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 на клиенте для полной асинхронной связи, пример здесь.
Надеюсь, поможет!