【问题标题】:Architecting a multithreaded app with a REST interface [closed]使用 REST 接口构建多线程应用程序 [关闭]
【发布时间】:2014-11-27 20:41:57
【问题描述】:

我正在研究可能的架构来解决问题。简而言之,问题是:我需要设计一个系统,允许客户端使用 HTTP/REST 进行连接以启动长时间运行的进程。每个进程都会创建到第三方服务器的持久连接,并将接收到的数据写入队列。只有当第三方服务器关闭连接或收到另一个 HTTP/REST 请求表明它应该被终止时,每个进程才会终止。

约束和背景:

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

我是一个较低级别的 C 人(有足够的 Python 经验来感觉自己胜任),但我试图将我的头脑包裹在可用于使这更容易的 Python 框架上。我的直觉是跳入杂草中,我知道如果我按照我的想法实现它,我还不如用 C 编写它。不想要那个。我想利用尽可能多的 Python 框架和库。性能不是重中之重。

我考虑过的方法:

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

  • 我考虑的第二种方法是使用 Celery 和 Flask 并简单地让 Celery 处理所有调度、线程管理等。我发现这篇文章显示 Celery and Flask 很好地结合在一起。这似乎是一种更简单的方法。

在写完这篇文章后,我倾向于使用 Celery 和 Flask 的第二种选择,虽然我对 Celery 了解不多,所以寻找你可能有的任何建议,以及我正在使用的其他可能的架构不考虑。非常感谢并提前感谢您。

【问题讨论】:

  • 致版主:什么?虽然我理解基于意见的问题,例如“哪种语言更好 C# 或 Java?”或“我应该把花括号放在哪里?”在 Stack Overflow 上没有一席之地,我非常强烈地不同意这个关于软件架构的合理问题属于基于意见的问题类别的想法。

标签: python rest architecture celery twisted


【解决方案1】:

是的,Twisted 在这里太过分了。

根据您的描述,Celery 和 Flask 的组合就足够了。它将允许您实现一个 REST 接口,将您长时间运行的进程作为 Celery 任务启动。您可以通过在任务 ID 上调用 Celery 的 revoke 方法轻松实现允许客户端停止运行任务的 REST 方法。请注意,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多