У меня есть сервер Linux, который обрабатывает запросы RPC Cap’n Proto. Некоторые из этих запросов должны пересылать данные в запросе на другой сервер, в данном случае это брокер Kafka. Библиотеки librdkafka и Cap’n Proto KJ могут использовать poll (), поэтому я думаю, что ОС гарантирует, что они могут работать асинхронно, но я не уверен, что дальнейшая интеграция необходима или полезна. У кого-нибудь есть опыт с этим?
Вопрос немного шире, чем особенности, которые я перечислил … есть другие API, которые я могу вызвать в будущем из Cap’n Proto RPC, так что любые общие рекомендации приветствуются.
К сожалению, это не так просто. Да, они оба используют poll (), но проблема в том, что только одна библиотека будет вызывать poll () одновременно, и только эта библиотека будет фактически получать какие-либо события — другая застряла. Это классическая задача для библиотек цикла событий — по умолчанию их нельзя использовать вместе.
Один из вариантов — попытаться использовать библиотеки в отдельных потоках. Но часто управляемые событиями библиотеки строятся вокруг предположения, что вы делаете все в одном потоке, потому что иначе зачем вам нужен цикл обработки событий?
Но «Правильная вещь» заключается в интеграции циклов событий. Цикл событий KJ может быть интегрирован с другими библиотеками событий. Например, я интегрировал его с libuv для node-capnp; см. первую часть этого файла:
https://github.com/kentonv/node-capnp/blob/master/src/node-capnp/capnp.cc
(В какой-то момент я планирую выделить здесь связанный с libuv код в отдельную библиотеку, поставляемую с Cap’n Proto.)
Для другого примера, вот запрос Натана Хурта на добавление интеграции с циклом событий Qt — но обратите внимание, что этот не включает интеграцию ввода-вывода, я думаю, потому что Натан использует реализацию AsyncIoStream
в который он вручную помещает данные, когда они доступны:
https://github.com/sandstorm-io/capnproto/pull/253
В любом случае вам нужно сделать что-то подобное с тем, что использует Кафка. Надеюсь, вы отправите свой код обратно в Cap’n Proto! 🙂
Других решений пока нет …