问题标签 [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.
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?
python - 如何获取调度服务名称?
使用 nameko,我有一个green_event
可以由两个不同的服务分派:
如何获取具有服务名称的变量?
python - 使用 FastApi 分页时出现 Pydantic 验证问题
这是我的代码片段:
当我在其中指定Page[PydenticModel]
时,response_model
它会产生一个问题,paginte()
因为它不是最终的响应类型。PydenticModel
对应new_items
和不对应items
(从 中返回)paginate()
,
注意:我不想使用 Page[Any] 来保持一个好的 Swagger 文档
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 |
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
状态)超过数据库连接限制。
有没有人使用类似的应用程序设置并遇到过这个问题?或者有什么诀窍吗?