使用REST接口构建多线程应用程序

问题描述:

我正在解决可能的问题体系结构。尽可能少的话,问题是:我需要设计一个系统,允许客户端使用HTTP/REST进行连接以启动长时间运行的进程。每个进程将创建到第三方服务器的持久连接,并将接收到的数据写入队列。每个进程只有在第三方服务器关闭连接或收到另一个HTTP/REST请求表明应该终止的情况下才会终止。使用REST接口构建多线程应用程序

约束和背景:

  • 客户端必须能够使用HTTP/REST连接
  • 系统必须用Python编写的

我是一个较低的C级的家伙(有足够的Python经验来感受能力),但是试图将我的头围绕可用于使这更容易的Python框架。我的直觉就是跳入杂草,我知道如果我按照自己的想法来实施这项工作,那么我可能已经用C写过了。不想那么做。我想尽可能多地利用Python的框架和库。性能不是重中之重。

途径,我认为:

  • 在做研究,我碰到来扭转这可能是一个合适的,似乎意义,我(想这是一个守护进程)。我想象最终产品将是一个Twisted应用程序,它公开一个REST接口,为每个接收到的客户端请求分派连接到第三方服务的新线程,并管理自己的线程池。我很熟悉线程,尽管他们还没有在Python中做过任何事情。简而言之,Twistedlooks very cool,尽管最后,我仍然想知道我是否过于复杂。

  • 第二种方法我认为是使用芹菜和瓶,只是让芹菜处理所有的调度,线程管理等我发现这篇文章显示Celery and Flask很好地玩在一起。这看起来很像一个更简单的方法。

写在这之后,我倾向于用芹菜和瓶的第二个选择,虽然我不知道很多关于芹菜,所以找你可能有任何建议,以及其他可能的体系结构我不考虑。我非常感谢,并提前谢谢你。

+0

要主持人:什么?虽然我理解基于意见的问题,比如“什么语言更好,C#或Java?”或者“我应该在哪里放大括号?”没有堆栈溢出的地方,我高度和强烈不同意这个问题,这个问题提出了一个有关软件架构的合理问题,符合基于意见的问题。 – 2014-10-03 14:46:51

是的,扭曲是在这里矫枉过正。

从你所描述的,芹菜和烧瓶的组合就足够了。它将允许您实现一个REST接口,将您长时间运行的进程作为Celery任务启动。您可以轻松实现REST方法,通过在任务ID上调用Celery的撤销方法,客户端可以停止运行任务。请注意,Celery依赖Message Broker来发送和接收消息(通常使用RabbitMQ),并使用数据后端来存储结果(通常使用Redis)。

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

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