Files
gochat/docs/comparison/Gochat-vs-Chatwoot-Full-Comparison.md
T
2026-06-04 15:44:48 +08:00

14 KiB
Raw Blame History

GoChat vs Chatwoot 全面对比 — 1:1 功能复制差距分析

生成日期:2026-05-24 目标:评估GoChat是否达到Chatwoot 1:1功能复制,具备生产级上线能力


一、总览对比

指标 Chatwoot GoChat 差距
API路由数 327+ 106 缺221+路由 (仅32%覆盖)
Handler方法数 ~150+ 99 缺51+方法
真实实现率 100% 57% 差43%
Stub/Placeholder 0 37个 全部需补实现
501 Not Implemented 0 6个 全部需补实现
消息队列调度 Sidekiq完整 WorkerPool全stub 不可用
渠道扩展机制 11渠道+Channelable 注册机制有+仅2渠道 缺9渠道
事件分发 Dispatcher+9 Listener Dispatcher骨架+无真实Listener 事件驱动完全不可用

二、按模块详细对比

完全实现模块(11个,56个方法)

模块 方法数 实现率 说明
Auth 8 100% Login/MFA/Register/Refresh/Logout/SwitchAccount/ResetPassword/ConfirmEmail
MFA 4 100% Enable/Verify/Disable/GetStatus
Captain Assistant 9 100% 完整CRUD + Search + Inbox关联
Captain Document 5 100% CRUD + Search
Captain Scenario 5 100% 完整CRUD
Captain Custom Tool 5 100% 完整CRUD
Copilot 3 100% SuggestReplies/Summarize/Translate
WebWidget 3 100% GetConfig/InitConversation/SendMessage
Telegram Channel 4 100% Configure/Deauthorize/Reauthorize/GetInfo
Analytics 6 100% Summary + 5类Metrics
LiveReport 3 100% AccountSummary + AgentConversation + Labels

⚠️ 部分实现模块(2个)

模块 Real Stub 差距说明
Account 1 (Delete) 4 (List/Get/Create/Update) CRUD全stub,仅Delete有真实实现
SAML 1 (Enable) 2 (GetConfig/InitiateLogin) 缺SSO登录流程

全Stub模块(9个,43个方法)—— 生产上线最大障碍

模块 Stub方法 501方法 Chatwoot对应功能 严重性
Contact 4 (List/Get/Create/Search) 2 (Update/Delete) M4-联系人管理 🔴 致命
Conversation 4 (List/Get/Create/UpdateLabels) 1 (Update) M3-对话核心 🔴 致命
Message 3 (List/Create/Search) 0 M3-消息核心 🔴 致命
Inbox 3 (List/Get/Create) 2 (Update/Delete) M2-渠道管理 🔴 致命
Profile 3 (Get/Update/DeleteAvatar) 0 M1-用户设置 🟡 重要
Notification 6 (List/Get/MarkRead/MarkAllRead/UnreadCount/DeleteAll) 0 M8-通知系统 🟡 重要
Team 4 (List/Create/Get/Update) 1 (Delete) M5-团队管理 🟡 重要
PlatformApp 2 (List/Create) 0 M12-平台应用 🟢 可后补
DashboardApp 2 (List/Create) 0 M12-仪表盘 🟢 可后补

三、消息队列调度系统差距

Chatwoot 事件驱动架构

Chatwoot使用 Wisper + Sidekiq 双层事件系统:

技术 功能 关键组件
同步层 Wisper广播 实时事件通知(ActionCable、AgentBot SyncDispatcher
异步层 Sidekiq Worker 持久化异步任务处理 9个AsyncDispatcher Listener
WebSocket ActionCable 前端实时推送 ActionCableListener
Push通知 FCM + Web Push 移动端推送 PushNotificationListener
Email Mailer 邮件通知 EmailNotificationListener

Chatwoot 9个异步Listener(全部通过Sidekiq持久队列):

  1. AutomationRuleListener — 事件触发自动化规则执行
  2. CampaignListener — 营销活动消息发送
  3. CsatSurveyListener — 满意度调查推送
  4. HookListener — Integration Hook执行
  5. InstallationWebhookListener — 平台级Webhook投递
  6. NotificationListener — 应用内通知创建
  7. ParticipationListener — 对话参与度更新
  8. ReportingEventListener — 报表数据聚合
  9. WebhookListener — Account Webhook投递

GoChat 当前状态

技术 状态 差距
事件总线 Watermill + Redis Streams 骨架有,未接入业务 EventBus定义了topic常量但无真实subscriber
PubSub接口 RedisPubSub + InMemoryPubSub 接口完整,无业务调用 Publish/Subscribe可用但service层从不调用
Dispatcher channel.Dispatcher + dispatch.Dispatcher 注册机制有,无真实Listener Dispatcher.Register可注册但无业务Listener实现
WorkerPool 全stub 不可用 Start/Stop返回nil,无任何job处理
WebSocket ws包 骨架有,无消息关联 broadcast/presence/typing有但未与pubsub联动

关键缺失:整个事件流转链路断裂

Chatwoot完整链路:
  用户操作 → Event → Wisper广播 → SyncDispatcher(实时) + Sidekiq(异步)
    → AutomationRuleListener → 执行规则 → 发消息/改状态/分配坐席
    → NotificationListener → 创建通知 → ActionCable推送前端
    → WebhookListener → HTTP POST到外部系统

GoChat当前链路:
  用户操作 → handler stub → 返回placeholder JSON → 结束(无事件发布)

差距量化:

  • Chatwoot 9个Async Listener → GoChat 0个
  • Chatwoot Sidekiq 6个Worker类型 → GoChat WorkerPool全stub
  • Chatwoot ActionCable 15+事件频道 → GoChat WebSocket未接入pubsub
  • Chatwoot Webhook投递(签名+重试+去重) → GoChat仅webhook_auth中间件

四、可扩展Inbox机制差距

Chatwoot Channelable架构

Chatwoot采用 多态 + Concern 模式,支持11种渠道类型:

渠道类型 Channel模型 状态 特殊功能
Channel::WebWidget channel_web_widgets 实时聊天+离线消息+欢迎语
Channel::Telegram channel_telegram Bot API+Webhook回调
Channel::FacebookPage channel_facebook_pages Messenger+OAuth刷新
Channel::Instagram channel_instagram DM+评论+OAuth
Channel::WhatsApp channel_whatsapp Meta Business API+Baileys
Channel::Email channel_email IMAP接收+SMTP发送
Channel::TwilioSMS channel_twilio_sms Twilio API
Channel::TwilioWhatsApp channel_twilio_whatsapp Twilio WA API
Channel::Line channel_line LINE Messaging API
Channel::Slack channel_slack Slack Events API
Channel::Api channel_api REST API接入

Chatwoot Inbox扩展性关键机制:

  1. Channelable concern — 统一接口(name/avatar_type/revalidate_credentials等)
  2. 多态关联 — Inbox belongs_to channel, polymorphic: true
  3. 渠道创建流程 — InboxBuilder根据channel_type选择对应Builder
  4. IncomingMessageService — 根据channel_type路由到对应处理逻辑
  5. OutgoingMessageService — 根据channel_type选择发送渠道
  6. OAuth刷新 — Reauthorizable concernFB/Instagram定期刷新token
  7. Webhook回调 — 每个渠道有独立webhook endpoint
  8. 渠道设置 — 每个渠道有独立设置页面和配置字段

GoChat 当前状态

机制 状态 差距
ChannelRegistry 完整实现 注册/获取/列举provider均可
ChannelProvider接口 完整定义 Type/Name/ConfigSchema/ValidateConfig/ProcessIncoming/SendOutgoing等
ChannelType枚举 定义了11种 但仅2种有真实provider
WebWidget provider 完整实现 pipeline+service+repository
Telegram provider 完整实现 pipeline+service+repository+webhook_handler
Facebook provider 无实现 model文件有但channel/provider/facebook.go缺失
WhatsApp provider 无实现 model文件有但无provider
Instagram provider 无实现 无任何文件
Email provider 无实现 无任何文件
TwilioSMS/WA provider 无实现 无任何文件
Line provider 无实现 无任何文件
Slack provider 无实现 无任何文件
API provider 无实现 model文件有(txt)但无provider
InboxBuilder 缺失 无根据channel_type选择Builder的逻辑
IncomingMessage路由 缺失 ProcessIncoming在provider接口定义但无真实路由调用
OutgoingMessage路由 缺失 SendOutgoing在provider接口定义但无真实调用
OAuth刷新 缺失 无Reauthorizable机制
渠道Webhook路由 仅1个stub /webhooks/:channel_type/:identifier placeholder

差距量化:

  • 11种渠道类型 → 仅2种有实现 (18%覆盖率)
  • Inbox CRUD 5方法 → 全stub (0%实现率)
  • InboxMember坐席绑定 → 无路由、无model关联
  • 渠道创建流程 → 无InboxBuilder
  • 消息收发路由 → 无Incoming/Outgoing消息路由到provider

五、Chatwoot完全缺失的API模块(路由级别)

# 缺失模块 缺失路由数 严重性
1 Agent/AgentBot 8+ 🔴 致命
2 Canned Responses 4 🟡 重要
3 Automation Rules 6 🟡 重要
4 Macros 5 🟡 重要
5 SLA Policies 5 🟡 重要
6 Custom Roles 5 🟡 重要
7 Agent Capacity Policies 7+ 🟡 重要
8 Assignment Policies 5+ 🔴 致命
9 Campaigns 5 🟢 可后补
10 Search(全局搜索) 5 🔴 致命
11 Companies 10+ 🟡 重要
12 CSAT Survey Responses 4+ 🟡 重要
13 Notes (对话笔记) 4 🟡 重要
14 Labels 3 🟡 重要
14 Attachments 3 🟡 重要
15 Integrations/Apps 10+ 🟢 可后补
16 Help Center/Portal 15+ 🟢 可后补
17 OAuth回调(FB/Instagram/WA) 5+ 🔴 致命
总计缺失路由 ~100+

六、结论与建议

当前状态:不具备生产级上线能力

三层架构断裂:

  1. Handler层断裂 — 9个核心CRM模块全stubContact/Conversation/Message/Inbox等),客服系统核心功能完全不可用
  2. 事件驱动断裂 — EventBus/PubSub/Dispatcher骨架存在但零业务接入,无Listener实现,无异步Worker处理,事件流转链路完全断裂
  3. 渠道扩展断裂 — 注册机制完整但仅2/11渠道有实现,Inbox CRUD全stub,消息收发路由未接入ChannelProvider

实现到1:1功能复制需要的工作量估算

优先级 模块 工作内容 预估天数
P0 致命 Conversation+Message 全部handler+service+repo真实实现+状态流转+标签+笔记+附件 4-5
P0 致命 Contact+Inbox 全部handler+service+repo+InboxBuilder+InboxMember+Channelable路由 3-4
P0 致命 Account完整CRUD List/Get/Create/Update真实实现 1
P0 致命 Agent/AgentBot+Assignment 新模块CRUD+自动分配引擎(round-robin/lowest-load) 3-4
P0 致命 事件驱动系统 9个Async Listener+WorkerPool(asynq)+PubSub→Service联动 3-4
P0 致命 消息收发路由 Incoming→ChannelProvider.ProcessIncoming+Outgoing→SendOutgoing 2-3
P1 重要 Notification+Webhook 全部handler+创建通知+Webhook投递(签名+重试) 2-3
P1 重要 Team+Profile 全部handler真实实现 1-2
P1 重要 AutomationRule+Macro+CSAT 新模块CRUD+规则执行引擎 2-3
P1 重要 SLA+CustomRole+CapacityPolicy 新模块CRUD 2
P1 重要 Search全局搜索 Elasticsearch/Meilisearch集成 1-2
P2 可后补 渠道集成(FB/WA/Email) 9个Channel Provider实现 5-8
P2 可后补 Companies+Campaign+HelpCenter 新模块 3-4
总计 约130+方法/API ~25-35天

建议执行策略

P0阶段(致命缺口,约15天):先让客服系统"能跑起来"

  1. Conversation+Message核心 — 对话创建+状态流转+消息收发
  2. Contact+Inbox核心 — 联系人管理+收件箱CRUD+渠道绑定
  3. 事件驱动接入 — PubSub→Service联动+WorkerPool(asynq)
  4. 消息收发路由 — Incoming/Outgoing→ChannelProvider
  5. Agent+自动分配 — 坐席管理+round-robin分配

P1阶段(运营必需,约10天):让系统"好用"

  1. Notification+Webhook — 坐席感知+外部集成
  2. Automation+Macro+CSAT — 自动化+满意度
  3. SLA+Role+Capacity — 企业级管理
  4. Team+Profile+Search — 团队协作+信息检索

P2阶段(可迭代,约10天):让系统"完整"

  1. 9个渠道Provider实现
  2. Companies+Campaign+HelpCenter
  3. OAuth刷新+更多渠道设置

附录:关键代码文件索引

功能 GoChat文件 状态
PubSub接口 internal/pubsub/pubsub.go 接口完整
Redis PubSub internal/pubsub/redis_pubsub.go Watermill实现
EventBus internal/pubsub/event_bus.go topic常量定义
Dispatcher internal/channel/dispatcher.go ⚠️ 注册机制有,无Listener
dispatch.Dispatcher internal/dispatch/dispatcher.go ⚠️ Sync/Async骨架,无业务接入
WorkerPool internal/worker/worker.go 全stub
ChannelRegistry internal/channel/registry.go 完整实现
ChannelProvider internal/channel/provider.go 接口完整
WebWidget Provider internal/channel/web_widget/ 完整实现
Telegram Provider internal/channel/telegram/ 完整实现
Facebook Provider internal/channel/provider/facebook.go 缺失
WhatsApp Provider internal/channel/provider/whatsapp.go 缺失
InboxHandler internal/handler/api/v1/inbox_handler.go 全stub
ContactHandler internal/handler/api/v1/contact_handler.go 全stub
ConversationHandler internal/handler/api/v1/conversation_handler.go 全stub
MessageHandler internal/handler/api/v1/message_handler.go 全stub