1
- # botgo
1
+ # BotGo
2
2
3
3
QQ频道机器人,官方 GOLANG SDK。
4
4
5
- [ 文档] ( https://pkg.go.dev/github.com/tencent-connect/botgo )
5
+ ![ Build] ( https://github.com/tencent-connect/botgo/actions/workflows/build.yml/badge.svg )
6
+ [ ![ Go Reference] ( https://pkg.go.dev/badge/github.com/tencent-connect/botgo.svg )] ( https://pkg.go.dev/github.com/tencent-connect/botgo )
7
+ [ ![ Examples] ( https://img.shields.io/badge/BotGo-examples-yellowgreen )] ( https://github.com/tencent-connect/botgo/tree/master/examples )
6
8
7
- ## 使用
8
9
9
- ### 1.请求 openapi 接口
10
+ ## 一、如何使用
11
+
12
+ ### 1.请求 openapi 接口,操作资源
10
13
11
14
``` golang
12
15
func main () {
@@ -22,7 +25,7 @@ func main() {
22
25
}
23
26
```
24
27
25
- ### 2.启动一个单独的 websocket 连接
28
+ ### 2.使用默认 SessionManager 启动 websocket 连接,接收事件
26
29
27
30
``` golang
28
31
func main () {
@@ -45,32 +48,36 @@ func main() {
45
48
}
46
49
```
47
50
48
- ### 3. 使用 session manager 启动多个连接
51
+ ## 二、什么是 SessionManager
49
52
50
- 接口定义在:` session_manager.go `
53
+ SessionManager,用于管理 websocket 连接的启动,重连等。 接口定义在:` session_manager.go ` 。开发者也可以自己实现自己的 SessionManager。
51
54
52
- sdk 实现了两个 session manager
55
+ sdk 中实现了两个 SessionManager
53
56
54
57
- [ local] ( ./sessions/local/local.go ) 用于在单机上启动多个 shard 的连接。下文用 ` local ` 代表
55
58
- [ remote] ( ./sessions/remote/remote.go ) 基于 redis 的 list 数据结构,实现分布式的 shard 管理,可以在多个节点上启动多个服务进程。下文用 ` remote ` 代表
56
59
57
60
另外,也有其他同事基于 etcd 实现了 shard 集群的管理,在 [ botgo-plugns] ( https://github.com/tencent-connect/botgo-plugins ) 中。
58
61
59
- ### 4. 生产环境中的建议
62
+ ## 三、生产环境中的一些建议
60
63
61
- 得益于 websocket 的机制,我们可以在本地就启动一个机器人,实现相关逻辑,但是在生产环境中需要考虑扩容,容灾等情况,所以建议从以下几方面考虑生产环境的部署:
64
+ 得益于 websocket 的机制,我们可以在本地就启动一个机器人,实现相关逻辑,但是在生产环境中需要考虑扩容,容灾等情况,所以建
65
+ 议从以下几方面考虑生产环境的部署:
62
66
63
- #### 公域机器人,优先使用分布式 shard 管理
67
+ ### 1. 公域机器人,优先使用分布式 shard 管理
64
68
65
69
使用上面提到的分布式的 session manager 或者自己实现一个分布式的 session manager
66
70
67
- #### 提前规划好分片
71
+ ### 2. 提前规划好分片
68
72
69
- 分布式 session manager 需要解决的最大的问题,就是如何解决 shard 随时增加的问题,类似 kafka 的 rebalance 问题一样,由于 shard 是基于频道 id 来进行 hash 的,所以在扩容的时候所有的数据都会被重新 hash。
73
+ 分布式 SessionManager 需要解决的最大的问题,就是如何解决 shard 随时增加的问题,类似 kafka 的 rebalance 问题一样,
74
+ 由于 shard 是基于频道 id 来进行 hash 的,所以在扩容的时候所有的数据都会被重新 hash。
70
75
71
- 提前规划好较多的分片,如 20 个分片,有助于在未来机器人接入的频道过多的时候,能够更加平滑的进行实例的扩容。比如如果使用的是 ` remote ` ,初始化时候分 20 个分片,但是只启动 2 个进程,那么这2个进程将争抢 20 个分片的消费权,进行消费,当启动更多的实例之后,伴随着 websocket 要求一定时间进行一次重连,启动的新实例将会平滑的分担分片的数据处理。
76
+ 提前规划好较多的分片,如 20 个分片,有助于在未来机器人接入的频道过多的时候,能够更加平滑的进行实例的扩容。比如如果使用的
77
+ 是 ` remote ` ,初始化时候分 20 个分片,但是只启动 2 个进程,那么这2个进程将争抢 20 个分片的消费权,进行消费,当启动更多
78
+ 的实例之后,伴随着 websocket 要求一定时间进行一次重连,启动的新实例将会平滑的分担分片的数据处理。
72
79
73
- #### 接入和逻辑分离
80
+ ### 3. 接入和逻辑分离
74
81
75
82
接入是指从机器人平台收到事件的服务。逻辑是指处理相关事件的服务。
76
83
@@ -83,30 +90,6 @@ sdk 实现了两个 session manager
83
90
84
91
提前规划好 kafka 的分片,然后从容的针对逻辑层做水平扩容。或者使用 pulsar(腾讯云上叫 tdmq) 来替代 kafka 避免 rebalance 问题。
85
92
86
- ## SDK 的设计模式
87
-
88
- 分为三个主要模块
89
-
90
- - openapi 用于请求 http 的 openapi
91
- - websocket 用于监听事件网关,接收事件消息
92
- - sessions 实现 session_manager 接口,用于管理 websocket 实例的新建,重连等
93
-
94
- openapi 接口定义:` openapi/iface.go ` ,同时 sdk 中提供了 v1 的实现,后续 openapi 有新版本的时候,可以增加对应新版本的实现。
95
- websocket 接口定义:` websocket/iface.go ` ,sdk 实现了默认版本的 client,如果开发者有更好的实现,也可以进行替换
96
-
97
-
98
- ## SDK 增加新接口or新事件开发说明
99
-
100
- ### 1. 如何增加新的 openapi 接口调用方法(预计耗时3min)
101
-
102
- - Step1: dto 中增加对应的对象
103
- - Step2: openapi 的接口定义中,增加新方法的定义
104
- - Step3:在 openapi 的实现中,实现这个新的方法
105
-
106
- ### 2. 如何增加新的 websocket 事件(预计耗时10min)
93
+ ## 四、SDK 开发说明
107
94
108
- - Step1: dto 中增加对应的对象 ` dto/websocket_payload.go `
109
- - Step2: 新增 intent,以及事件对应的 intent(如果有)` dto/intents.go `
110
- - Step3: 新增事件类型与 intent 的关系 ` dto/websocket_event.go `
111
- - Step4: 新增 event handler 类型,并在注册方法中补充断言,` websocket/event_handler.go `
112
- - Step5:websocket 的具体实现中,针对收到的 message 进行解析,判断 type 是否符合新添加的时间类型,解析为 dto 之后,调用对应的 handler ` websocket/client/event.go `
95
+ 请查看:[ 开发说明] ( ./DEVELOP.md )
0 commit comments