Я хочу реализовать облегченный прокси-сервер очереди сообщений. Его задача - получать сообщения от веб-приложения (PHP) и асинхронно отправлять их на сервер очереди сообщений. Причина этого прокси в том, что MQ не всегда доступен и иногда отстает или даже не работает, но я хочу убедиться, что сообщения доставляются, а веб-приложение немедленно возвращается.
Итак, PHP отправит сообщение прокси-серверу MQ, работающему на том же хосте. Этот прокси-сервер будет сохранять сообщения в SQLite для сохранения в случае сбоев. В то же время он будет отправлять сообщения из SQLite в MQ пакетами, когда соединение доступно, и удалять их из SQLite.
Насколько я понимаю, в этом сервисе есть следующие компоненты:
- message listener (listens to the messages from PHP and writes them to a Incoming Queue)
- DB flusher (reads messages from the Incoming Queue and saves them to a database; due to SQLite single-threadedness)
- MQ connection handler (keeps the connection to the MQ server online by reconnecting)
- message sender (collects messages from SQlite db and sends them to the MQ server, then removes them from db)
Я думал об использовании Twisted для №1 (TCPServer), но у меня возникла проблема с его интеграцией с другими точками, которые не управляются событиями. Интуиция подсказывает мне, что каждая из этих точек должна выполняться в отдельном потоке, потому что все они связаны с вводом-выводом и независимы друг от друга, но я мог бы легко поместить их в один поток. Тем не менее, я не смог найти никаких хороших и понятных (для меня) примеров того, как реализовать этот рабочий поток помимо основного цикла Twisted.
В качестве примера я начал использовать chatserver.py, который использует service.Application и объекты internet.TCPServer. Если я запускаю свой собственный поток до создания службы TCPServer, он запускается несколько раз, но останавливается и больше никогда не запускается. Я не уверен, почему это происходит, но, вероятно, потому, что я неправильно использую потоки с Twisted.
Есть предложения о том, как реализовать отдельный рабочий поток и сохранить Twisted? Вы думаете об альтернативных архитектурах?