Skip to content

Commit ab72a0c

Browse files
committed
testcase: update readme
1 parent 2e7552d commit ab72a0c

File tree

3 files changed

+55
-43
lines changed

3 files changed

+55
-43
lines changed

DEVELOP.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# 开发说明
2+
3+
## 一、SDK 的设计模式
4+
5+
分为三个主要模块
6+
7+
- openapi 用于请求 http 的 openapi
8+
- websocket 用于监听事件网关,接收事件消息
9+
- sessions 实现 session_manager 接口,用于管理 websocket 实例的新建,重连等
10+
11+
openapi 接口定义:`openapi/iface.go`,同时 sdk 中提供了 v1 的实现,后续 openapi 有新版本的时候,可以增加对应新版本的实现。
12+
websocket 接口定义:`websocket/iface.go`,sdk 实现了默认版本的 client,如果开发者有更好的实现,也可以进行替换
13+
14+
15+
## 二、SDK 增加新接口or新事件开发说明
16+
17+
### 1. 如何增加新的 openapi 接口调用方法(预计耗时3min)
18+
19+
- Step1: dto 中增加对应的对象
20+
- Step2: openapi 的接口定义中,增加新方法的定义
21+
- Step3:在 openapi 的实现中,实现这个新的方法
22+
23+
### 2. 如何增加新的 websocket 事件(预计耗时10min)
24+
25+
- Step1: dto 中增加对应的对象 `dto/websocket_payload.go`
26+
- Step2: 新增 intent,以及事件对应的 intent(如果有)`dto/intents.go`
27+
- Step3: 新增事件类型与 intent 的关系 `dto/websocket_event.go`
28+
- Step4: 新增 event handler 类型,并在注册方法中补充断言,`websocket/event_handler.go`
29+
- Step5:websocket 的具体实现中,针对收到的 message 进行解析,判断 type 是否符合新添加的时间类型,解析为 dto 之后,调用对应的 handler `websocket/client/event.go`

README.md

+24-41
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
# botgo
1+
# BotGo
22

33
QQ频道机器人,官方 GOLANG SDK。
44

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)
68

7-
## 使用
89

9-
### 1.请求 openapi 接口
10+
## 一、如何使用
11+
12+
### 1.请求 openapi 接口,操作资源
1013

1114
```golang
1215
func main() {
@@ -22,7 +25,7 @@ func main() {
2225
}
2326
```
2427

25-
### 2.启动一个单独的 websocket 连接
28+
### 2.使用默认 SessionManager 启动 websocket 连接,接收事件
2629

2730
```golang
2831
func main() {
@@ -45,32 +48,36 @@ func main() {
4548
}
4649
```
4750

48-
### 3. 使用 session manager 启动多个连接
51+
## 二、什么是 SessionManager
4952

50-
接口定义在:`session_manager.go`
53+
SessionManager,用于管理 websocket 连接的启动,重连等。接口定义在:`session_manager.go`。开发者也可以自己实现自己的 SessionManager。
5154

52-
sdk 实现了两个 session manager
55+
sdk 中实现了两个 SessionManager
5356

5457
- [local](./sessions/local/local.go) 用于在单机上启动多个 shard 的连接。下文用 `local` 代表
5558
- [remote](./sessions/remote/remote.go) 基于 redis 的 list 数据结构,实现分布式的 shard 管理,可以在多个节点上启动多个服务进程。下文用 `remote` 代表
5659

5760
另外,也有其他同事基于 etcd 实现了 shard 集群的管理,在 [botgo-plugns](https://github.com/tencent-connect/botgo-plugins) 中。
5861

59-
### 4. 生产环境中的建议
62+
## 三、生产环境中的一些建议
6063

61-
得益于 websocket 的机制,我们可以在本地就启动一个机器人,实现相关逻辑,但是在生产环境中需要考虑扩容,容灾等情况,所以建议从以下几方面考虑生产环境的部署:
64+
得益于 websocket 的机制,我们可以在本地就启动一个机器人,实现相关逻辑,但是在生产环境中需要考虑扩容,容灾等情况,所以建
65+
议从以下几方面考虑生产环境的部署:
6266

63-
#### 公域机器人,优先使用分布式 shard 管理
67+
### 1.公域机器人,优先使用分布式 shard 管理
6468

6569
使用上面提到的分布式的 session manager 或者自己实现一个分布式的 session manager
6670

67-
#### 提前规划好分片
71+
### 2.提前规划好分片
6872

69-
分布式 session manager 需要解决的最大的问题,就是如何解决 shard 随时增加的问题,类似 kafka 的 rebalance 问题一样,由于 shard 是基于频道 id 来进行 hash 的,所以在扩容的时候所有的数据都会被重新 hash。
73+
分布式 SessionManager 需要解决的最大的问题,就是如何解决 shard 随时增加的问题,类似 kafka 的 rebalance 问题一样,
74+
由于 shard 是基于频道 id 来进行 hash 的,所以在扩容的时候所有的数据都会被重新 hash。
7075

71-
提前规划好较多的分片,如 20 个分片,有助于在未来机器人接入的频道过多的时候,能够更加平滑的进行实例的扩容。比如如果使用的是 `remote`,初始化时候分 20 个分片,但是只启动 2 个进程,那么这2个进程将争抢 20 个分片的消费权,进行消费,当启动更多的实例之后,伴随着 websocket 要求一定时间进行一次重连,启动的新实例将会平滑的分担分片的数据处理。
76+
提前规划好较多的分片,如 20 个分片,有助于在未来机器人接入的频道过多的时候,能够更加平滑的进行实例的扩容。比如如果使用的
77+
`remote`,初始化时候分 20 个分片,但是只启动 2 个进程,那么这2个进程将争抢 20 个分片的消费权,进行消费,当启动更多
78+
的实例之后,伴随着 websocket 要求一定时间进行一次重连,启动的新实例将会平滑的分担分片的数据处理。
7279

73-
#### 接入和逻辑分离
80+
### 3.接入和逻辑分离
7481

7582
接入是指从机器人平台收到事件的服务。逻辑是指处理相关事件的服务。
7683

@@ -83,30 +90,6 @@ sdk 实现了两个 session manager
8390

8491
提前规划好 kafka 的分片,然后从容的针对逻辑层做水平扩容。或者使用 pulsar(腾讯云上叫 tdmq) 来替代 kafka 避免 rebalance 问题。
8592

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 开发说明
10794

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)

testcase/channel_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ func TestChannel(t *testing.T) {
2626
})
2727
t.Run("create live channel", func(t *testing.T) {
2828
api.PostChannel(ctx, testGuildID, &dto.ChannelValueObject{
29-
Name: "机器人创建2",
30-
Type: dto.ChannelTypeLive,
29+
Name: "机器人创建分组",
30+
Type: dto.ChannelTypeCategory,
3131
Position: 0, // 默认是当前时间戳,如果传递,则要避免和其他频道的 position 重复,否则会报错
3232
ParentID: "0", // 父ID,正常应该找到一个分组ID,如果传0,就不归属在任何一个分组中
3333
})

0 commit comments

Comments
 (0)