2014-10-02 3 views
1

Я работаю над возможной архитектурой проблемы. В максимально возможном числе проблема заключается в следующем: мне нужно создать систему, которая позволяет клиентам подключаться с помощью HTTP/REST для запуска длительных процессов. Каждый процесс создает постоянное соединение с сторонним сервером и записывает полученные данные в очередь. Каждый процесс будет завершен только в том случае, если сторонний сервер закрывает соединение или будет получен другой запрос HTTP/REST, указывающий, что он должен быть завершен.Архитектура многопоточного приложения с интерфейсом REST

Ограничения и фон:

  • Клиенты должны иметь возможность подключиться с помощью HTTP/REST
  • Система должна быть написана на Python

Я на C парень ниже уровня (с достаточным опытом Python, чтобы чувствовать себя компетентным), но пытаюсь обернуть голову вокруг фреймворков Python, доступных для упрощения. Моя кишка - прыгать в сорняки, и я знаю, реализую ли это это, как я думаю, я мог бы написать это на C. Не хочу этого. Я хочу использовать как можно больше фреймворков и библиотек для Python. Производительность не является главным приоритетом.

Подходы Я рассмотрел:

  • При этом исследование, я наткнулся на Twisted, которые могут быть целесообразными, и, кажется, имеет смысл для меня (думать об этом как демон). Я предполагаю, что конечным продуктом будет приложение Twisted, которое предоставляет интерфейс REST, отправляет новые потоки, подключающиеся к сторонней службе для каждого полученного запроса клиента, и будет управлять собственным пулом потоков. Я знаком с потоками, хотя, по общему признанию, с ними еще ничего не сделал в Python. Вкратце, Twistedlooks very cool, хотя, в конце концов, мне стало интересно, не слишком ли я это преувеличиваю.

  • Второй подход я считал использует сельдерей и колба и просто позволить сельдерея обрабатывать все диспетчеризацию, управление потоками и т.д. Я нашел эту статью, показывающую Celery and Flask играть хорошо вместе. Это похоже на гораздо более простой подход.

После написания этого, я склоняюсь к второму варианты использования сельдерея и колбы, хотя я не знаю много о сельдерее, поэтому ищу любые советы вы могли бы иметь, а также другие возможные архитектуры что я не рассматриваю. Я действительно ценю это и благодарю вас заранее.

+0

Для модераторов: Что?Хотя я понимаю, что такие основанные на мнениях вопросы, как «Какой язык лучше C# или Java?» или «Где я должен положить фигурные скобки?» не имеют места в переполнении стека, я очень категорически не согласен с идеей этого вопроса, который задает разумный вопрос о архитектуре программного обеспечения, вписывается в категорию вопросов, основанных на мнениях. –

ответ

0

Да, Twisted здесь излишне.

Из того, что вы описали, было бы достаточно сочетание Celery и Flask. Это позволит вам реализовать интерфейс REST, который запускает ваши длительные процессы как задачи Сельдерея. Вы можете легко реализовать метод REST, позволяющий клиентам прекратить выполнение задач, вызвав метод отзыва Selery на идентификаторе задач. Обратите внимание, что сельдерей зависит от брокера сообщений для отправки и получения сообщений (часто используется RabbitMQ) и бэкенда данных для хранения результатов (часто используется Redis).

>>> from celery.task.control import revoke 
>>> revoke(task_id, terminate=True) 

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks

Смежные вопросы