【问题标题】:How can two Python applications hosted in different servers communicate?托管在不同服务器上的两个 Python 应用程序如何通信?
【发布时间】:2019-12-06 05:26:36
【问题描述】:

我很难弄清楚如何解决一个小项目的问题。

基本上我有一个 Django 应用程序。另一方面,我有一个外部 Python 脚本正在运行。我想创建一个系统,每次提交我的 Django 应用程序中的表单时,表单中提交的数据都会发送到外部 Python 应用程序。

外部 Python 服务应该接收数据,读取数据,并根据用户是谁以及他提交了什么,它应该执行一些任务,然后发送响应。

这是我的想法: 1) 将外部 Python 应用程序连接到 Django 正在使用的同一数据库。这样当表单提交时,它就会保存在数据库中,并且可以与第二个 Python 服务“共享”数据。这个解决方案的问题是我需要第二个应用程序每秒查询数据库并执行大量查询,这将是性能问题。 2)创建一个epi端点,以便外部python应用程序连接到端点并从那里获取保存在数据库中的数据。问题与第一个解决方案相同。在这种情况下,像 Redis 或 RabbitMQ 这样的服务会有所帮助吗?

在我的 Django 应用程序中导入外部 Python 进程不是解决方案,它需要与 Django 应用程序分开。对此的一个重要要求是速度。当新数据提交时,需要在最短的时间内被第二个 Python 应用接收到。

也就是说,我愿意接受任何建议或可能的解决方案来解决这个问题,在此先感谢 :)

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以使用microservices 架构来构建它。您无需在两个应用程序之间共享数据库,而是让它们通过 Web 请求相互通信。 Django 将使用相关数据向您的其他应用程序发出请求,而其他服务器将响应结果。

    通常人们会使用Flask(同步服务器)或Sanic(异步服务器)之类的东西来接收/回复,但您也可以查看Nameko之类的东西。还建议您查看Docker,因为最终,当您设置更多这些微服务时,您将需要它。


    这个想法是(即使用Flask),创建一个访问点,对您的数据进行一些计算并将其返回给 Django 服务器。

    computation.py
    from flask import Flask
    from flask import request
    
    app = Flask(__name__)
    
    @app.route("/", methods=["POST"])
    def computation():
        data = request.get_json()
        print(data)
    
        return f"Hey! {data}"
    
    app.run(host="0.0.0.0", port=8090)
    

    Django 服务器只是向您的服务器应用程序发送一个请求。

    django_mock.py
    import requests
    
    req = requests.post('http://0.0.0.0:8090/', json={"data": "Hello"})
    print(req.text)
    

    以上内容将在computation.py 应用程序上打印出来:

    {'data': 'Hello'}
    

    并将在django_mock.py 示例中打印出来:

    Hey! {'data': 'Hello'}
    

    【讨论】:

    • 感谢您的回答。是的,我也是这么想的。这里的问题是:我如何发送请求?接收数据的外部 Python 应用程序也应该在烧瓶中?以及外部服务如何接收请求
    • 为您添加了一个示例——您正在创建一个由Flask 在您计算机上的某个随机端口上运行的单独服务器,并且您正在通过 Django 向它发送正常的 Web 请求。跨度>
    • 如果脑海中浮现的第一个想法是“这个架构似乎很慢”,我是第一个说我用来分享这种情绪的人。然而,这几乎是当今大型在线服务世界的默认设置。 Here 是一个有趣的关于 Netflix 微服务架构的演讲,如果你有兴趣的话。
    • 嗯,速度是其中的一个重要部分,但慢是什么意思?你的例子非常清楚和有用,我想我应该遵循它。是的,在为这个项目进行研究时,我多次使用“微服务”这个词,所以我认为这就是我需要的 :)
    • 我的意思是它并不像起初看起来那么慢。在开始之前,有几个问题值得问自己;一个重要的问题是:服务需要是异步的还是同步的(您是同时接收多个计算请求,还是不分别)?如果是这样,您需要研究一下 Python 的 awaitasyncio,并且最好查看 Sanic 而不是 Flask。如果计算不会彼此并行发生,您应该只使用Flask
    【解决方案2】:

    您应该构建一个 API。第二个应用程序现在将成为应用程序服务器,第一个应用程序在收到用户提交的表单时,会将其数据保存到数据库,然后通过此 API 对第二个应用程序进行 API 调用。您将在 API 请求中包含用于标识数据库中记录的关键信息。

    您可以使用 Django(例如 DRF)或 Flask 在 Python 中实现一个简单的 API 服务器。

    现在,这要求您的应用服务器始终处于启动和运行状态。如果它倒了怎么办?第一个应用程序应该做什么?如果您需要这种级别的灵活性,那么您需要以某种方式解耦这些应用程序。如果第一个应用程序无法发送到第二个应用程序,则第一个应用程序会实施某种退避/重试。或者您使用可靠的排队机制(例如 Amazon SQS)。

    【讨论】:

    • 我已经想过用 DRF 创建一个 api 端点。所以基本上,有人提交表单,数据可以从 api 端点检索。这样做的问题是第二个 Python 应用程序必须每秒查询端点。我认为这对我的第一台服务器来说有点太重了
    • 我认为第二个应用程序将 24x7 全天候运行,但大部分时间都是空闲的。第一个应用程序也在运行 24x7 接受表单提交。交互是第二个应用程序中的第一个应用程序调用 API。然后第二个应用程序从数据库中获取相关数据。第二个应用程序不调用第一个应用程序。或者,只需让第一个应用程序将相关数据放入队列,并让第二个应用程序定期轮询该队列。
    • 好的!但是 Django 应用程序如何调用第二个应用程序中的 api?
    • 如何通过网络调用any API?您向已知 URL 发出 HTTP(S) GET 或 POST 请求。在 Python 中,您可以使用 Requests 库或等效库。理想情况下,您的客户端进行身份验证,或者这两个系统位于专用网络上,这样您就不会受到不良行为者调用您的 API 的影响。
    • 同样的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2018-11-18
    • 2012-12-28
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多