News Hacker|极客洞察

23 183 天前 github.com
🤔DBOS Java:Postgres 驱动的持久化工作流,跨服务隔离与数据库支持争议
只靠 Postgres 就能搞定跨服务工作流吗?

🎯 讨论背景

这是 DBOS Java SDK 的发布讨论,主题围绕该库以 Postgres 作为检查点后端来实现持久化工作流。评论基于实际工程需求关心几类问题:DBOS 哪些功能必须依赖 Postgres、在微服务架构下如何处理 system db 的隔离与跨服务工作流、与 Temporal 这类成熟平台在可观测性上的差异,以及对其它数据库(如 MySQL/SQLite)和语言/运行时(如 Clojure、Python gevent)的支持。维护者在回复中解释了设计取舍:优先稳固 Postgres 后端、提供 Conductor 管理 UI(当前托管并计划自托管)、并在 Python 客户端实现对 SQLite 与 gevent 的兼容。讨论反映出团队在可用性、跨服务通信与多语言适配之间需要权衡的工程挑战。

📌 讨论焦点

Postgres 专有性与通用 JDBC 支持质疑

有评论质疑 DBOS 标榜的功能哪些确实依赖 Postgres,认为在 Java 生态中应能通过任何符合 JDBC 的后端工作。维护者解释 DBOS 将 checkpoint 存在 Postgres,因此这是核心依赖,但应用数据可以与其它数据库并存且 DBOS Python 已为 SQLite 添加支持,团队强调先把一个后端做稳再扩展。评论者担心若没有通用 JDBC 后端支持,会限制在以 MySQL 为主的公司采用或迁移的灵活性。

[来源1] [来源2] [来源3]

跨服务工作流与 system db 隔离问题

一位评论指出示例通常在单一应用内、用单个 system db 运行,但官方建议每个服务使用独立的 system db 以实现隔离,这在多服务流程中带来实际困难。当前要让不同服务参与同一工作流,需把工作流拆成多个并由调用方通过 client.enqueue 将步骤推到目标服务,这导致工作流碎片化、必须公开其他服务的 system db 信息,并且由推送替代原本可以由 worker 拉取的模型。维护者建议的改进包括在 workflows 表增加 "application name" 字段,让多个应用在同一 system db 内共存并支持跨应用直接 enqueue,从而改善可观察性与跨服务体验。

[来源1] [来源2]

可观测性与管理 UI(与 Temporal 的对比)

有用户表示之所以采用 Temporal(包括 Temporal Cloud/Nexus)是因为成熟的可观测性與管理界面,没人愿意手工在数据库里查任务或花时间自建监控 UI。维护者回复 DBOS 有工作流观测与管理 UI(Conductor),功能包括查看 workflows 与 queues、按任意条件搜索/过滤、可视化步骤图,以及取消/恢复或从某一步重启等操作。Conductor 当前作为托管产品提供,团队表示会很快发布可自托管版本,以回应对运行时可视化和运维工具的需求。

[来源1] [来源2]

数据库支持与路线图(MySQL、SQLite)

有人询问是否计划支持 MySQL;维护者强调当前重心是把 Postgres 后端做稳,DBOS Python 最近为 SQLite 增加了支持,但目前没有 MySQL 的计划。评论补充说明 DBOS 的检查点机制需要 Postgres,但架构上可以与其它数据库(比如 MySQL)并行使用来存储应用数据,从而在一定程度上缓解兼容性顾虑。团队表示先专注一个后端以确保稳定性,但未来并不排斥扩展到更多数据库引擎。

[来源1] [来源2] [来源3]

Python 客户端与 gevent 兼容性

有人询问 DBOS Python 与 gevent(Python 的协程/事件库)的兼容性,维护者回复称 DBOS Python 可以开箱与 gevent 一起工作。具体原因是同步版 DBOS 使用 Python 线程 API 与 psycopg3 驱动,而 gevent 的 monkeypatch 可使这些调用在协程环境下兼容。维护者还请用户在遇到问题时反馈,另有开发者表示他们正用 Flask + gevent,希望无缝集成 DBOS Python,表明该兼容性在实战中具有实际需求。

[来源1] [来源2] [来源3]

注解式 API 在 Clojure 的适配困难

有评论指出 DBOS 采用的 annotation-based(注解式)Java API 对 Clojure 这类基于 JVM 的 Lisp 语言来说使用体验会很糟。注解风格是 Java 的习惯,但在 Clojure 中通常需要写额外的包装或适配层来绑定注解驱动的行为,增加上手成本。这一点反映出库设计在多语言生态下的可用性问题,如果想吸引更多 JVM 语言用户,可能需要提供非注解或更函数式的替代接口。

[来源1]

📚 术语解释

DBOS: DBOS(以 Postgres 为后端的持久化工作流库/框架):负责在数据库中保存工作流检查点与队列状态,提供 Java 和 Python 客户端,并配套观测与管理工具。

system db: system db:指 DBOS 用来存储工作流元数据、检查点和队列等控制信息的 PostgreSQL 数据库实例,官方建议每个服务可使用独立的 system db 以保证隔离。

Conductor: Conductor(DBOS 的管理与观测 UI):提供查看/搜索/可视化工作流、取消/恢复/从指定步骤重启等操作,目前有托管版本并计划发布自托管版本。

Temporal: Temporal:一个流行的分布式工作流平台,提供开源和托管(Temporal Cloud、Nexus 等)解决方案,以成熟的可观测性和管理界面著称。

JDBC: JDBC(Java Database Connectivity):Java 的标准关系型数据库连接 API,Java 生态通常期望通过 JDBC 支持多种数据库后端。

gevent: gevent:Python 的协程/并发库,通过 greenlet 和 monkeypatch 对标准库的 IO 进行协作式切换,常用于在 Flask 等框架中实现高并发。

psycopg3: psycopg3:Python 与 PostgreSQL 的驱动库,DBOS Python 使用该驱动,并在 gevent 场景下依赖其被 monkeypatch 后的兼容性。