[ISSUE #220] Add HTTP Sink Connector Document (#221)
* docs: add HTTP Sink Connector Chinese docs
* docs: add HTTP Sink Connector English docs
* fix:update something
* fix:update something
diff --git a/docs/design-document/03-connect/02-http-connector.md b/docs/design-document/03-connect/02-http-connector.md
index 3aeeb5b..b62b776 100644
--- a/docs/design-document/03-connect/02-http-connector.md
+++ b/docs/design-document/03-connect/02-http-connector.md
@@ -5,12 +5,14 @@
### Configuration
Before using HTTP source connector, you need to configure the server.
+
- Please configure `sourceEnable` to `true` in `/resource/server-config.yml` to enable source functionality.
-- Please configure the source connector in `/resource/source-config.yml`, only the configuration under `connectorConfig` is described here:
- - `connectorName`, name of the connector.
- - (required) `path`, path of the API.
- - (required) `port`, port of the API.
- - `idleTimeout`, idle TCP connection timeout in seconds. A connection will timeout and be closed if no data is received nor sent within the `idleTimeout` seconds. The default is 0, which means don't timeout.
+- Please configure the source connector in `/resource/source-config.yml`, only the configuration under `connectorConfig`
+ is described here:
+ - `connectorName`, name of the connector.
+ - (required) `path`, path of the API.
+ - (required) `port`, port of the API.
+ - `idleTimeout`, idle TCP connection timeout in seconds. A connection will timeout and be closed if no data is received nor sent within the `idleTimeout` seconds. The default is 0, which means don't timeout.
### Startup
@@ -25,15 +27,16 @@
```yaml
connectorConfig:
- connectorName: httpSource
- path: /test
- port: 3755
- idleTimeout: 5
+ connectorName: httpSource
+ path: /test
+ port: 3755
+ idleTimeout: 5
```
The above example configures a URL `http://localhost:3755/test` in `source-config.yml`.
-You can send messages in `binary` mode or `structured` mode as specified in [cloudevent-spec](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/bindings/http-protocol-binding.md).
+You can send messages in `binary` mode or `structured` mode as specified
+in [cloudevent-spec](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/bindings/http-protocol-binding.md).
Here are two examples:
@@ -65,3 +68,147 @@
"data": "testdata"
}'
```
+
+## HTTP Sink Connector
+
+The HTTP sink connector has two modes: common and webhook.
+
+First of all, either mode has the basic function of sinkConnector, which is to send a message to the target HTTP server.
+When the response is received from the HTTP server, the common mode only cares about the status code of the response to
+determine whether it was sent successfully, while the webook mode not only cares about whether it was sent successfully
+or not, but also stores the data of the response (called the callback data) and provides callback data exposure services
+to the outside world.
+
+The specific differences between the two are as follows:
+
+- Default Idle TCP Connection Timeout
+
+ The default value is 5000ms for common mode and 15000ms for webhook mode.
+
+- Processing of response results
+
+ The common mode only cares about the status code of the response, while the webhook mode will also store the callback
+ data and provide callback data exposure services to the public.
+
+### Configuration
+
+Before using the HTTP sink connector, you need to configure the sink.
+
+- Please configure `sinkEnable` to true in `/resource/server-config.yml` to enable sink function.
+
+- Please configure the sink connector in `/resource/sink-config.yml`, only the configuration under `connectorConfig` is
+ described here:
+
+ The simplest configuration of the common mode:
+
+ ```yaml
+ connectorConfig:
+ connectorName: httpSink
+ urls:
+ - http://127.0.0.1:8987/test
+ ```
+
+ The simplest configuration for webhook mode:
+
+ ```yaml
+ connectorConfig:
+ connectorName: httpSink
+ urls:
+ - http://127.0.0.1:8987/test
+ webhookConfig:
+ activate: true
+ port: 8988
+ ```
+
+All configurations for the HTTP sink connector are listed below:
+
+| Field | Type | Required or not | Clarification | Remark |
+|---------------------------------|---------|--------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| connectorName | String | yes | Connector Name | |
+| urls | List | yes | List of URLs to receive messages | The default port is 80 for HTTP protocol and 443 for HTTPS protocol<br />The legal URL format are:<br />http://127.0.0.1:8987/test<br />http://127.0.0.1/test<br />https://example.com:4943/test<br/>https://example.com/test<br/> |
+| keepAlive | Boolean | no | Whether to use HTTP persistent connection | Default: true |
+| keepAliveTimeout | Integer | no | HTTP persistent connection timeout | Unit: ms,default: 60000 |
+| connectionTimeout | Integer | no | TCP connection timeout | Unit: ms,default: 5000 |
+| idleTimeout | Integer | no | TCP idle timeout | Unit: ms,default: 5000(common), 15000(webhook) |
+| maxConnectionPoolSize | Integer | no | Maximum number of HTTP connections for the client | Default: 5 |
+| retryConfig | Object | | Configuration of the retry mechanism | |
+| retryConfig.maxRetries | Integer | no | Maximum number of retries | Does not include first attempt, default: 2 |
+| retryConfig.interval | Integer | no | Retry interval | Unit: ms, default: 2000 |
+| retryConfig.retryOnNonSuccess | Boolean | no | Whether to retry requests that receive a non-2xx response | Default: false, retries only network level error requests |
+| webhookConfig | Object | | Configuration of Webhook Mode | |
+| webhookConfig.activate | Boolean | no | Whether to enable Webhook mode | Default: false |
+| webhookConfig.exportPath | String | no | Callback data exposure path | Default: /export<br/>The request method is fixed to GET<br/>Request Parameters:<br />type:peek (default value, get data)/poll (get and delete data)<br />pageNum: must be greater than 0 when type is peek, invalid when type is poll<br/>pageSize: must be greater than 0 |
+| webhookConfig.port | Integer | Yes (when enabled) | Callback data exposure port | |
+| webhookConfig.serverIdleTimeout | Integer | no | TCP idle timeout length for servers exposing callback data | Unit: ms, default: 5000 |
+| webhookConfig.maxStorageSize | Integer | no | Store the maximum value of the callback data queue | Default: 5000 |
+
+### Startup
+
+1. start EventMesh Runtime
+2. start eventmesh-connector-http
+
+Once that's done, send a message to the EventMesh, and then your message will happen to the target HTTP server via an
+HTTP request. If webhook mode is enabled, an HTTP server will also be opened at the same time to provide callback data
+exposure to the outside world.
+
+### Data Format
+
+The data format of the message sent by the HTTP sink connector is as follows:
+
+- type: consists of connectorName, protocol, and mode.
+- time: the time the request was sent
+- uuid: request unique identifier, one-to-one with the uuid of the callback data structure in webhook mode
+- eventId: event ID, composed of type and offset
+- data:actual data to be sent
+
+```json
+{
+ "type": "httpSink.http.webhook",
+ "time": "2024-05-09T22:27:02.028",
+ "uuid": "951d88ee-2503-4df3-a1dd-6e4a6a1c3d3b",
+ "eventId": "httpSink.http.webhook-0",
+ "data": ${ConnectRecord}
+}
+```
+
+When webhook mode is enabled, an HTTP server is also enabled to provide callback data exposure to the outside world. The
+format of the callback data is as follows:
+
+- pageNum: current page number
+- pageSize: size per page
+- pageItems: the callback data array obtained
+- The meaning of the fields of pageItem is as follows:
+ - data: callback data returned from the callback server
+ - metadata: metadata, the fields have the following meanings:
+ - url: the URL to get the callback data
+ - code: the status code of the response to the request callback data, or -1 if a network level error occurred (
+ response could not be received).
+ - message: response information from the request callback data, or exception information if a network level
+ error occurred (response could not be received).
+ - uuid: a unique request identifier for the callback data, corresponding to the uuid carried in the message sent
+ above.
+ - receivedTime: response time for requesting callback data
+ - retryNum: number of retries
+ - retriedBy: record the uuid of the request being retried if a retry is sent, otherwise null
+
+```json
+{
+ "pageNum": 1,
+ "pageSize": 10,
+ "pageItems": [
+ {
+ "data": "callbackData",
+ "metadata": {
+ "url": "http://127.0.0.1:8987/test",
+ "code": 200,
+ "message": "OK",
+ "receivedTime": "2024-05-09 22:53:21.556",
+ "uuid": "fba29061-1a1f-4482-9c83-43ba4e0bcf3f",
+ "retriedBy": null,
+ "retryNum": 0
+ }
+ }
+ ]
+}
+```
+
diff --git a/docs/roadmap.md b/docs/roadmap.md
index 6fb92e3..9ac2e40 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -57,7 +57,7 @@
| [Kafka](https://github.com/apache/eventmesh/tree/master/eventmesh-connectors/eventmesh-connector-kafka) | ✅ | ✅ |
| [Pulsar](https://github.com/apache/eventmesh/tree/master/eventmesh-connectors/eventmesh-connector-pulsar) | ✅ | ✅ |
| [RabbitMQ](./design-document/connect/rabbitmq-connector) | ✅ | ✅ |
-| [HTTP](./design-document/connect/http-connector) | ✅ | ⬜ |
+| [HTTP](./design-document/connect/http-connector) | ✅ | ✅ |
| [JDBC](https://github.com/apache/eventmesh/tree/master/eventmesh-connectors/eventmesh-connector-jdbc) | ⬜ | ✅ |
| [Spring](https://github.com/apache/eventmesh/tree/master/eventmesh-connectors/eventmesh-connector-spring) | ✅ | ✅ |
| [OpenFunction](https://github.com/apache/eventmesh/tree/master/eventmesh-connectors/eventmesh-connector-openfunction) | ✅ | ✅ |
diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/design-document/03-connect/02-http-connector.md b/i18n/zh/docusaurus-plugin-content-docs/current/design-document/03-connect/02-http-connector.md
index 95287d5..710e47b 100644
--- a/i18n/zh/docusaurus-plugin-content-docs/current/design-document/03-connect/02-http-connector.md
+++ b/i18n/zh/docusaurus-plugin-content-docs/current/design-document/03-connect/02-http-connector.md
@@ -25,10 +25,10 @@
```yaml
connectorConfig:
- connectorName: httpSource
- path: /test
- port: 3755
- idleTimeout: 5
+ connectorName: httpSource
+ path: /test
+ port: 3755
+ idleTimeout: 5
```
上述的例子在`source-config.yml`中配置了一个 URL `http://localhost:3755/test`.
@@ -64,4 +64,135 @@
"datacontenttype":"text/plain",
"data": "testdata"
}'
-```
\ No newline at end of file
+```
+
+## HTTP Sink Connector
+
+HTTP sink connector 拥有两种模式:common 和 webhook。
+
+首先,无论是哪种模式,都具备sinkConnector的基本功能,即将消息发送给目标HTTP服务器。当收到HTTP服务器的响应时,common模式只关心响应的状态码,以判断是否发送成功,而webook模式除了关心是否发送成功以外,还将响应的数据(称为回调数据)进行存储,并对外提供回调数据暴露服务。两者的具体差别如下:
+
+- 默认空闲 TCP 连接超时时间
+
+ common模式的默认值为5000ms,webhook模式则为15000ms。
+
+- 响应结果的处理
+
+ common模式只关心响应的状态码,而webhook模式还会存储回调数据,并对外提供回调数据暴露服务。
+
+### 配置
+
+使用 HTTP sink connector 前,需要进行 sink 的配置。
+
+- 请在 `/resource/server-config.yml` 中配置 `sinkEnable`为`true` 以开启sink 功能。
+
+- 请在 `/resource/sink-config.yml`中配置 sink connector,在此仅说明 `connectorConfig` 下的配置:
+
+ common模式的最简配置:
+
+ ```yaml
+ connectorConfig:
+ connectorName: httpSink
+ urls:
+ - http://127.0.0.1:8987/test
+ ```
+
+ webhook模式的最简配置:
+
+ ```yaml
+ connectorConfig:
+ connectorName: httpSink
+ urls:
+ - http://127.0.0.1:8987/test
+ webhookConfig:
+ activate: true
+ port: 8988
+ ```
+
+HTTP sink connector 的所有配置如下:
+
+| 属性 | 类型 | 是否必填 | 说明 | 备注 |
+|---------------------------------|---------|--------|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| connectorName | String | 是 | connector名称 | |
+| urls | List | 是 | 接收消息的URL列表 | HTTP协议默认端口为80,HTTPS协议则为443<br />合法URL格式为:<br />http://127.0.0.1:8987/test<br />http://127.0.0.1/test<br />https://example.com:4943/test<br/>https://example.com/test<br/> |
+| keepAlive | Boolean | 否 | 是否使用HTTP持久连接 | 默认:true |
+| keepAliveTimeout | Integer | 否 | HTTP持久连接超时时长 | 单位:ms,默认:60000 |
+| connectionTimeout | Integer | 否 | TCP连接超时时长 | 单位:ms,默认:5000 |
+| idleTimeout | Integer | 否 | TCP空闲超时时长 | 单位:ms,默认:5000(common),15000(webhook) |
+| maxConnectionPoolSize | Integer | 否 | 客户端的最大HTTP连接数 | 默认:5 |
+| retryConfig | Object | | 重试机制的相关配置 | |
+| retryConfig.maxRetries | Integer | 否 | 最大重试次数 | 不包含首次尝试,默认:2 |
+| retryConfig.interval | Integer | 否 | 重试间隔 | 单位:ms,默认:2000 |
+| retryConfig.retryOnNonSuccess | Boolean | 否 | 是否重试收到非2xx响应的请求 | 默认:false,仅重试网络层面的错误请求 |
+| webhookConfig | Object | | Webhook模式的相关配置 | |
+| webhookConfig.activate | Boolean | 否 | 是否启用Webhook模式 | 默认:false |
+| webhookConfig.exportPath | String | 否 | 回调数据暴露路径 | 默认:/export<br/>请求方式固定为GET<br/>请求参数有<br />type:peek(默认值,获取数据)/poll(获取并删除数据)<br />pageNum:当type为peek时,必须大于0,当type为poll时,该参数无效<br/>pageSize:必须大于0 |
+| webhookConfig.port | Integer | 是(启用时) | 回调数据暴露端口 | |
+| webhookConfig.serverIdleTimeout | Integer | 否 | 暴露回调数据的服务器的TCP空闲超时时长 | 单位:ms,默认:5000 |
+| webhookConfig.maxStorageSize | Integer | 否 | 存储回调数据队列的最大值 | 默认:5000 |
+
+### 启动
+
+1. 启动 EventMesh Runtime
+2. 启动 eventmesh-connector-http
+
+完成之后,向 EventMesh 发送消息,然后你的消息就会通过HTTP请求发生给目标HTTP服务器了。如果启用webhook模式,则还会同时开启一个
+HTTP 服务器对外提供回调数据暴露服务。
+
+### 数据格式
+
+HTTP sink connector 发送消息的数据格式如下:
+
+- type:由connectorName、协议、模式所组成
+- time:发送请求的时间
+- uuid:请求唯一标识,在webhook模式中和回调数据结构的uuid一一对应
+- eventId:事件ID,由type和offset组成
+- data:实际需要发送的数据
+
+```json
+{
+ "type": "httpSink.http.webhook",
+ "time": "2024-05-09T22:27:02.028",
+ "uuid": "951d88ee-2503-4df3-a1dd-6e4a6a1c3d3b",
+ "eventId": "httpSink.http.webhook-0",
+ "data": ${ConnectRecord}
+}
+```
+
+启用webhook模式时,则还会同时开启一个 HTTP 服务器对外提供回调数据暴露服务。获取的回调数据格式如下:
+
+- pageNum:当前页数
+- pageSize:每页的大小
+- pageItems:获取的回调数据数组
+- pageItem的字段含义如下:
+ - data:从回调服务器返回的回调数据
+ - metadata:元数据,字段含义如下:
+ - url: 获取回调数据的URL
+ - code:请求回调数据得到的响应状态码,如果发生的网络层面的错误(无法收到响应),则为-1
+ - message:请求回调数据得到的响应信息,如果发生的网络层面的错误(无法收到响应),则为相关异常信息
+ - uuid:请求回调数据的唯一请求标识,和上面发送消息时所携带的uuid一一对应
+ - receivedTime:请求回调数据得到的响应时间
+ - retryNum:重试次数
+ - retriedBy:如果发送重试,则记录被重试的请求的uuid,否则为null
+
+```json
+{
+ "pageNum": 1,
+ "pageSize": 10,
+ "pageItems": [
+ {
+ "data": "callbackData",
+ "metadata": {
+ "url": "http://127.0.0.1:8987/test",
+ "code": 200,
+ "message": "OK",
+ "receivedTime": "2024-05-09 22:53:21.556",
+ "uuid": "fba29061-1a1f-4482-9c83-43ba4e0bcf3f",
+ "retriedBy": null,
+ "retryNum": 0
+ }
+ }
+ ]
+}
+```
+