1

假设我在机器 1 上有 Python 进程 1,在机器 2 上有 Python 进程 2。这两个进程是相同的,并且处理负载均衡器发送的数据。

两个进程都需要与数据库交互——在我的例子中是 Postgres,所以每个进程都需要知道它应该与哪个数据库通信,它需要在每台机器上拥有正确的模型等等。它耦合得太紧了。

理想的情况是有一个单独的进程来处理数据库的东西,比如连接、跟上数据库模型的变化、对数据库的请求等。我的进程 1 和进程 2 应该做的只是说我有一些 JSON 数据需要在此表上保存或更新,或者我需要 json 格式的数据。

也许我问的是不可能的问题,但是当分布式进程以最解耦的方式与关系数据库交互时,是否有任何 Python 解决方案至少可以让生活变得更轻松一些?

4

2 回答 2

2

您可以将SQLAlchemy放在RESTful接口后面。

这是 Python REST(Web 服务)框架的 Python 推荐中的一个简单的 RESTful 服务器?

于 2012-04-06T14:38:34.877 回答
1

如果是你感兴趣的数据库连接信息,我最近为此写了一个服务。每个进程都在配置中设置了令牌,并使用这些令牌来查询服务以获取数据库连接信息。数据层使用该信息来创建连接,不存储 DSN。在服务器端,您只需维护一个 token->DSN 映射字典。

您可以使用 bpgergo 的建议进行连接池,但您仍应包括身份验证或识别方法。这样,如果存在网络入侵,恶意客户端可能无法模拟其中一个客户端。

服务实现分为几个部分:

  • 支持表单调用的 RESTful 服务http://192.168.1.100/getConnection?token=mytokenstring
  • 存储映射的键值存储系统,例如{'mytokenstring': {'dbname': 'db', 'ip': '192.168.1.101', 'user': 'dbuser', 'password': 'password', ..}
    • 该系统不应该在前端网络上,但是如果您的 Web 层受到威胁,这种方法不会为您购买任何数据库保护。
  • 一个 db 对象,在实例化时,使用适当的令牌检索 dsn 并创建一个新的 db 连接。
    • 如果可以,您应该将此连接对象重新用于页面响应的其余部分。服务的响应时间会很快,但是数据库连接需要更多的开销。

实施后,在切换令牌后面的 dsn 信息时需要注意处理模式不兼容问题。您可以通过将令牌固定到用户会话等来解决此问题。

于 2012-04-06T14:46:56.140 回答