ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Chatto横向扩展与高可用架构完整指南:多进程+NATS集群实现无状态水平扩展

Chatto横向扩展与高可用架构完整指南:多进程+NATS集群实现无状态水平扩展 Chatto横向扩展与高可用架构完整指南多进程NATS集群实现无状态水平扩展【免费下载链接】chattoA fully-featured team and group chat application that you can easily selfhost.项目地址: https://gitcode.com/gh_mirrors/chatt/chattoChatto是一个可自托管的全功能团队与群聊应用团队聊天、群组聊天、语音、附件齐全。它的最大架构特点是把NATS JetStream 集群作为唯一持久化数据源应用进程本身完全无状态因此天然支持多进程横向扩展与高可用部署——加一台机器就能扩容摘掉一台机器也不掉线。为什么 Chatto 能加机器就扩容大多数聊天系统要水平扩展得先处理数据库主从、会话粘滞、消息队列这些麻烦。Chatto 走了一条更直接的路见 ADR-002 与 ADR-001设计决策对扩展的意义单二进制 内嵌 NATS小规模时一条命令启动零依赖不是限制只是起点外接 NATS 集群应用无论连内嵌还是远程 NATS都只是普通 NATS 客户端NATS JetStream 为唯一数据源没有关系数据库扩容故事是 NATS 原生的Raft 共识无需数据库主从进程内只做内存投影每个副本从事件流重建读模型副本之间互不依赖关键结论来自 架构清单运行时是进程级的但被设计为多个 Chatto 副本连到同一个 NATS 账号下安全运行——正确性来自 JetStream 和 KV 的原子性而不是进程内锁或单例协程。横向扩展第一步把状态交给外部 NATS 集群chatto run默认在内嵌 NATS 中运行适合单机自托管。要横向扩展只需要把存储层换成外部 NATS集群版开启 JetStream 即可Chatto 进程随即变成无状态服务事件日志EVT所有持久化领域事实消息、房间、成员、权限、资产……以 protobuf 事件追加写入用 JetStream 乐观并发控制OCC防冲突RUNTIME_STATEKV跨副本共享的最新值状态凭证、加密包装、通知边界等KV 的原子写保证多副本并发安全MEMORY_CACHEKV内存级易失共享记录存活状态、租约、计数器节点丢失不丢数据实时推送JetStream 把已提交事实重发布到live.evt.各副本本地投影跟上后才推给客户端。资源全景流、KV、对象存储、消费者清单见 NATS 资源清单事件与主题命名见 主题与事件清单。多副本一致性事件溯源 内存投影多个副本同时读写时Chatto 靠三件事保证不出错写路径追加即提交。写操作向EVT追加带 OCC 守卫的事件冲突会被 JetStream 直接拒绝并提示重试不会出现两个副本各改一半的状态授权与聚合 OCC 设计见 ADR-087。读路径本地投影追平才服务。每个副本从EVT重建内存投影写者会等待相关投影序列跟上实现读己之写。副本重启或新扩容进来冷启动只是重放一遍事件不需要迁移数据。断连自愈NATS 恢复门。副本在 NATS 连接出现空档时会把自己标记为不健康、隔离实时会话、恢复易失资源、刷新 KV 监听并等待投影追平恢复停滞 5 分钟后才触发存活探针失败见 运行时组件清单 中的 NATS recovery gate 条目。后台任务多副本共享持久消费者 选举视频转码、资产清理、推送投递、密钥销毁等后台工作不是每台机器干一份而是所有副本共享同一个 JetStream 持久消费者如chatto-asset-processing-v1at-least-once 投递 幂等处理 显式 ack任务中断会被自动重投消费者是版本化的持久资源可缩容到零仍保留进度需要全局唯一的工作LiveKit 对账、投影快照发布、孤儿清理通过 KV 租约选举出当前负责人副本挂掉后租约过期自动转移。可选能力搜索、导出器、资产处理以运行时单元目录注册在 cli/cmd/run.go内嵌单元失败只降级该能力并由监督者按指数退避上限 30 秒重启不会拖垮整个服务进程。实战部署K8s 三副本高可用清单仓库内置了可直接使用的 Kubernetes 示例examples/k8s/README.mdnats.yamlNATS 以StatefulSet运行--jetstream 持久卷数据不出集群chatto.yamlChatto 以Deployment运行replicas: 3三个副本对 Ingress 完全等价滚动更新策略maxUnavailable: 0maxSurge: 1配合/readyz就绪探针与/healthz存活探针实现零停机升级。核心操作只有几条命令摘自 K8s 示例说明# 查看副本状态与日志 kubectl -n chatto get pods kubectl -n chatto logs -f deployment/chatto # 扩容到 5 个副本新副本自动重放 EVT 投影后接入流量 kubectl -n chatto scale deployment/chatto --replicas5 # 零停机滚动重启 kubectl -n chatto rollout restart deployment/chatto由于副本无状态扩容 加 Pod缩容 删 Pod不存在会话粘滞和数据迁移。扩展方案对照清单规模推荐形态说明个人 / 小团队单二进制 内嵌 NATSchatto run一条命令数据目录备份即可中型团队1 个 NATS N 个 Chatto 副本本指南的主场景K8s 示例直接可用大型 / 多机房NATS 集群JetStream Raft N 副本存储层自身高可用扩容故事是 NATS 原生的ADR-001小结Chatto 的无状态设计让多进程水平扩展成为连接数问题而不是数据分片问题一致性由JetStream OCC 写入 内存投影追平 KV 原子共享状态共同保证后台任务用共享持久消费者 租约选举在多副本间协作与容错想动手体验直接从 examples/k8s/ 的三副本清单开始或阅读 ADR-002 了解内嵌只是起点外接集群才是扩展位的设计动机。【免费下载链接】chattoA fully-featured team and group chat application that you can easily selfhost.项目地址: https://gitcode.com/gh_mirrors/chatt/chatto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表