托管在不同服务器上的两个Python应用程序如何通信?

时间:2019-12-05 20:42:23

标签: python django

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用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'}

答案 1 :(得分:1)

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

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

现在,这要求您的应用服务器始终保持运行状态。如果出现故障怎么办?第一个应用程序应该做什么?如果您需要这种灵活性,则需要以某种方式将这些应用程序解耦。如果第一个应用程序无法发送到第二个应用程序,则它会执行某种后退/重试。或者您使用可靠的排队机制(类似于Amazon SQS)。