Я хочу реализовать облегченный прокси очереди сообщений. Его задача - получать сообщения из веб-приложения (PHP) и асинхронно отправлять их на сервер очереди сообщений. Причиной этого прокси-сервера является то, что MQ не всегда доступен и иногда отстает или даже не работает, но я хочу убедиться, что сообщения доставлены, и веб-приложение немедленно возвращается.
Итак, PHP отправит сообщение прокси-серверу MQ, работающему на том же хосте. Этот прокси сохранит сообщения в SQLite для сохранения в случае сбоев. В то же время он будет отправлять сообщения из SQLite в MQ партиями, когда соединение будет доступно, и удалять их из SQLite.
Теперь, насколько я понимаю, в этом сервисе есть следующие компоненты:
- прослушиватель сообщений (прослушивает сообщения из PHP и записывает их в очередь входящих сообщений)
- Очиститель БД (читает сообщения из входящей очереди и сохраняет их в базе данных; из-за однопоточности SQLite)
- Обработчик подключения MQ (поддерживает подключение к серверу MQ в режиме онлайн путем повторного подключения)
- отправитель сообщений (собирает сообщения из базы данных SQlite и отправляет их на сервер MQ, затем удаляет их из базы данных)
Я думал об использовании Twisted для # 1 (TCPServer), но у меня возникли проблемы с его интеграцией с другими точками, которые не управляются событиями. Интуиция говорит мне, что каждая из этих точек должна выполняться в отдельном потоке, потому что все они связаны с вводом-выводом и не зависят друг от друга, но я мог бы легко поместить их в один поток. Несмотря на то, что я не смог найти хороших и понятных (для меня) примеров того, как реализовать этот рабочий поток, помимо основного цикла Twisted.
Пример, с которого я начал, это chatserver.py , который использует объекты service.Application и internet.TCPServer. Если я запускаю свой собственный поток до создания службы TCPServer, он запускается несколько раз, но останавливается и больше никогда не запускается. Я не уверен, почему это происходит, но, вероятно, потому, что я неправильно использую потоки с Twisted.
Какие-либо предложения о том, как реализовать отдельный рабочий поток и сохранить Twisted? Есть ли у вас какие-либо альтернативные архитектуры?