14 KiB
14 KiB
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 |
| Mailer | 邮件通知 | EmailNotificationListener |
Chatwoot 9个异步Listener(全部通过Sidekiq持久队列):
- AutomationRuleListener — 事件触发自动化规则执行
- CampaignListener — 营销活动消息发送
- CsatSurveyListener — 满意度调查推送
- HookListener — Integration Hook执行
- InstallationWebhookListener — 平台级Webhook投递
- NotificationListener — 应用内通知创建
- ParticipationListener — 对话参与度更新
- ReportingEventListener — 报表数据聚合
- 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扩展性关键机制:
- Channelable concern — 统一接口(name/avatar_type/revalidate_credentials等)
- 多态关联 — Inbox belongs_to channel, polymorphic: true
- 渠道创建流程 — InboxBuilder根据channel_type选择对应Builder
- IncomingMessageService — 根据channel_type路由到对应处理逻辑
- OutgoingMessageService — 根据channel_type选择发送渠道
- OAuth刷新 — Reauthorizable concern(FB/Instagram定期刷新token)
- Webhook回调 — 每个渠道有独立webhook endpoint
- 渠道设置 — 每个渠道有独立设置页面和配置字段
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+ |
六、结论与建议
当前状态:不具备生产级上线能力
三层架构断裂:
- Handler层断裂 — 9个核心CRM模块全stub(Contact/Conversation/Message/Inbox等),客服系统核心功能完全不可用
- 事件驱动断裂 — EventBus/PubSub/Dispatcher骨架存在但零业务接入,无Listener实现,无异步Worker处理,事件流转链路完全断裂
- 渠道扩展断裂 — 注册机制完整但仅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天):先让客服系统"能跑起来"
- Conversation+Message核心 — 对话创建+状态流转+消息收发
- Contact+Inbox核心 — 联系人管理+收件箱CRUD+渠道绑定
- 事件驱动接入 — PubSub→Service联动+WorkerPool(asynq)
- 消息收发路由 — Incoming/Outgoing→ChannelProvider
- Agent+自动分配 — 坐席管理+round-robin分配
P1阶段(运营必需,约10天):让系统"好用"
- Notification+Webhook — 坐席感知+外部集成
- Automation+Macro+CSAT — 自动化+满意度
- SLA+Role+Capacity — 企业级管理
- Team+Profile+Search — 团队协作+信息检索
P2阶段(可迭代,约10天):让系统"完整"
- 9个渠道Provider实现
- Companies+Campaign+HelpCenter
- 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 |