Интеграция zmq в приложение flask-socketio как (комбу) транспорт message_queue

Я работаю над приложением Flask-SocketIO, которое интегрируется с zmq. Основная предпосылка приложения заключается в том, что веб-сервер Flask-SocketIO получает сообщение zmq, а затем сообщение zmq преобразуется в сообщение SocketIO, которое отправляется клиенту (браузеру). У меня приложение работает, но не совсем так, как я хочу, чтобы оно работало.

Необходимо, чтобы прослушиватель событий zmq находился в отдельном процессе, нежели основной процесс сервера. Я был в состоянии использовать Redis и RabbitMQ в качестве очереди сообщений для облегчения передачи SocketIO из несерверных процессов. Ок, отлично. Так в чем проблема?

Проблема в том, что я действительно хотел бы использовать zmq в качестве очереди сообщений вместо Redis или RabbitMQ, так как я уже интегрируюсь с zmq в своем приложении. Итак, я прочитал в документации Flask-SocketIO, что Kombu является механизмом поддержки других типов очередей сообщений. Ладно, круто. Но потом я замечаю, что zmq как транспорт был удален из последней версии Kombu. И, насколько я могу судить, это было только экспериментально, когда это была транспортная опция, как в Kombu 3.0.37.

Мой первый подход состоял в том, чтобы просто попробовать zmq как транспорт сообщений через Kombu 3.0.37, но это не работает. Я все еще пытаюсь точно определить, почему это так. Но, пожалуй, после того, как мы немного рассмотрим исходный код, я думаю, что несколько процессов пытаются открыть гнездо PULL на одном и том же порту, что просто не работает, даже в простом независимом примере. И это имеет смысл. С этой точки зрения, мой следующий шаг - вручную создать сокет PULL независимо от транспортного кода zmq и каким-то образом передать его как тип синглтона для использования транспортным кодом zmq.

Другой подход, над которым я работаю, - заставить zmq работать как транспорт в примере Hello World Kombu. Я поменял строку подключения в примере кода с zmq+tcp://localhost, Здесь становится ясно, что я не понимаю, как использовать zmq в качестве транспорта очереди сообщений. Если я запускаю код издателя, я могу отправить сообщение. Но когда я запускаю код клиента через несколько секунд, он говорит, что очередь пуста. Это заставляет меня думать, что для работы zmq в качестве транспорта мне может понадобиться какой-нибудь внешний брокер сообщений zmq, который, как я полагаю, мне нужно будет собрать самостоятельно. Но я еще не понял, как это будет работать.

Какие-либо предложения? Это пустая трата времени, чтобы попытаться использовать zmq в качестве транспорта, или я должен продолжать идти по этому пути? Мигель Гринберг (автор Flask-SocketIO) любезно предоставил какое-то направление, но я хотел немного уйти, чтобы узнать, есть ли у кого-нибудь еще какие-то мысли по этому поводу.

0 ответов

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