问题标签 [nameko]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
93 浏览

python - 用于 Postgresql 的 pyscopg2 驱动程序的潜在 Nameko 一致性问题

我们正在构建一个使用 Posgresql 作为服务数据存储的 Python 微服务应用程序。乍一看,Nameko 似乎是一个很好的起点。然而,关于 Concurrency 的 Nameko 文档部分包含以下声明

Nameko 构建在 eventlet 库之上,该库通过“greenthreads”提供并发性。并发模型是带有隐式让步的协程。
隐式屈服依赖于猴子修补标准库,以在线程等待 I/O 时触发屈服。如果您的带有 nameko 的主机服务在命令行上运行,Nameko 将为您应用猴子补丁。
每个工人都在自己的绿色线程中执行。可以根据每个工作人员等待 I/O 所花费的时间来调整并发工作人员的最大数量。
Worker 是无状态的,因此本质上是线程安全的,但依赖项应确保它们对每个 Worker 都是唯一的,或者以其他方式安全地被多个 Worker 并发访问。
请注意,许多使用套接字并且通常被认为是线程安全的 C 扩展可能不适用于 greenthreads。其中有 librabbitmq、MySQLdb 等。

因此,我们的架构师建议 Nameko 不会飞——因为尽管 pyscopg2 Postgresql 驱动程序被宣传为线程安全的:

它的主要特点是Python DB API 2.0规范的完整实现和线程安全(多个线程可以共享同一个连接)。它专为大量多线程应用程序而设计

澄清

上述观察仅对常规线程有效:它们不适用于分叉进程或绿色线程。libpqconnections 不应由分叉进程使用,因此当使用诸如 multiprocessing 之类的模块或诸如 FastCGI 之类的分叉 Web 部署方法时,请确保在分叉之后创建连接。不同的绿色线程也不应该共享连接:有关更多详细信息,请参阅对协程库的支持。

通过链接澄清

警告 Psycopg 连接不是绿色线程安全的,不能由不同的绿色线程同时使用。尝试使用每个线程一个游标一次执行多个命令将导致错误(或在 2.4.2 之前的版本上出现死锁)。因此,建议程序员要么避免在协程之间共享连接,要么使用库友好的锁来同步共享连接,例如用于池化。

正常的服务配置将让服务拥有一个存储库,该存储库具有由线程共享的连接,存储库访问方法使用该连接上的会话,范围为该方法。

我们的架构师建议,即使我们要使用每个线程的连接+会话,因为如果我们在会话上的数据访问调用之间执行其他 I/O 操作,例如文件写入,greenthreads 在给定会话上的隐式屈服方面是如何工作的通过日志记录,我们可能会遭受隐式上下文切换——这可能会导致日志记录后的会话出现问题。

在这种情况下,我们有什么合理的方式可以使用 Nameko,还是像我们的架构师所说的那样注定要失败?有什么方法可以让我们无需编写自己的微服务代码(例如使用Kombu )就可以完成这项工作?

附加说明:此页面上的评论建议有关数据库驱动程序状态:

您可以使用与 SQLAlchemy 兼容的任何数据库驱动程序,只要它与 eventlet 一起使用是安全的。这将包括所有纯 python 驱动程序

它继续列出 pysqlite 和 pymysql。

使用 pg8000 或 py-postgresql 纯 Python 驱动程序会让我们更清楚地了解线程 - 这里的问题是 greenthreads 与使用 C 代码的 pyscopg2/3 驱动程序相结合,还是从根本上 Namekos 使用 greenthreads?

0 投票
1 回答
27 浏览

python - 如何获取调度服务名称?

使用 nameko,我有一个green_event可以由两个不同的服务分派:

如何获取具有服务名称的变量?

0 投票
0 回答
90 浏览

python - 使用 FastApi 分页时出现 Pydantic 验证问题

这是我的代码片段:

当我在其中指定Page[PydenticModel]时,response_model它会产生一个问题,paginte()因为它不是最终的响应类型。PydenticModel对应new_items和不对应items(从 中返回)paginate()

注意:我不想使用 Page[Any] 来保持一个好的 Swagger 文档

0 投票
1 回答
59 浏览

pyinstaller - nameko http 微服务运行失败,cyphon 编译 pyd 文件但 py 文件很好

我开发了一个nameko http微服务,它可以运行良好,但是如果我将文件myhttp.py替换为一个名为myhttp.py的cyphon编译文件,我会得到[curl: (7) Failed to connect to localhost port 8000:连接被拒绝],请帮助我。

第 1 步:使用以下 3 个文件(build.bat、setup.py、myhttp.py)生成 myhttp.pyd

构建.bat

安装程序.py

我的http.py

第2步:使用下面3个文件(installer.bat、namekorun.py、namekorun.spec)和刚才生成的myhttp.pyd生成namekorun.exe

安装程序.bat

名称korun.py

名称korun.spec

第三步:启动dist/namekorun/namekorun.exe,然后在命令窗口输入 curl -i -d "world" localhost:8000/hello ,得到 curl: (7) Failed to connect to localhost port 8000: Connection refused ,如果用 myhttp.py 替换 myhttp.pyd,它运行良好

我的包如下并使用vs2015

包裹 版本
Python 3.6.8
赛通 3.0.0a9
装饰师 4.4.2
小事件 0.25.1
海带 4.6.8
名子 2.12.0
安装程序 4.7
pyinstaller-hooks-contrib 2021.4
0 投票
0 回答
45 浏览

python - 服务器使用 SQLAlchemy NullPool 配置意外关闭连接

我有以下项目设置:

  • 我们正在使用 python nameko 框架来相互通信微服务(使用 RabbitMQ 作为传输)
  • 在生产环境中,容器使用 docker-swarm 编排器进行管理。
  • 使用PostgreSQL DB + SQLAlchemy ORM + nameko-sqlalchemy
  • 数据库连接池配置为NullPool,因此池被禁用,我们按需签出连接。

但是,当我们有巨大的 RPC 请求负载(每秒超过 1k)时,我们偶尔会遇到此错误:

我们假设问题可能在于在短时间内签出和连接到数据库,因此我们尝试QueuePool(pool_size=N, max_overflow=M)了(使用pre_ping=True)。我们确信 N+M 远低于 database max_connections。但是,随着时间的推移,此设置会导致以下问题:

因为存在连接泄漏......可能(?)nameko服务重新启动后,新idle连接被创建而不关闭旧连接,并且随着时间的推移,我们的服务创建的连接(通常处于idle状态)超过数据库连接限制。

有没有人使用类似的应用程序设置并遇到过这个问题?或者有什么诀窍吗?