什么是 SSE
SSE(Server-Sent Events)是一种基于 HTTP 的服务器推送技术,可以实现服务器向客户端持续推送数据。SSE 基于标准的 HTTP 协议,利用了 HTTP/1.1 中的持久连接(Keep-Alive)和分块传输编码(Chunked Transfer Encoding)技术,可以实时地推送数据给客户端,而不需要客户端发送请求。
SSE 可以用于实现实时通知、聊天室、股票行情、在线游戏等场景。
SSE 的优点
相比于其他服务器推送技术(如 WebSocket、Comet),SSE 有以下优点:
- SSE 基于标准的 HTTP 协议,不需要特殊的协议支持,可以在现有的基础上快速实现。
- SSE 使用 HTTP 的长连接,可以避免频繁的连接和断开操作,减少服务器的负担。
- SSE 使用分块传输编码(Chunked Transfer Encoding)技术,可以实现边传输边处理,提高传输效率。
- SSE 支持自定义事件类型和数据格式,可以根据应用场景进行定制化。
SSE 的实现方式
SSE 的实现方式比较简单,只需要在服务器端发送符合规范的 HTTP 响应即可。
客户端向服务器发起一个 HTTP 请求,请求头中包含
Accept: text/event-stream。服务器返回一个符合 SSE 规范的 HTTP 响应,包含以下信息:
HTTP/1.1 200 OK Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive data: Hello world!\n\n
响应头中需要包含
Content-Type: text/event-stream,表示返回的是 SSE 数据。响应体中以data:开头,后面跟着一条数据,最后以两个换行符结束。服务器可以在任何时候向客户端发送数据,只需要按照规范发送即可。客户端接收到数据后,会自动触发
message事件。data: Hello world!\n\n
上面的数据表示一条消息,内容为
Hello world!。
SSE 的性能测试方法
SSE 的性能测试主要包括两个方面:数据传输的性能测试和订阅投递的性能测试。
数据传输的性能测试
数据传输的性能测试主要测试 SSE 在传输大量数据时的性能表现。测试方法可以采用 ab 命令或者 Apache JMeter 工具。
使用 ab 命令进行测试:
ab -n 10000 -c 100 -H "Accept: text/event-stream" http://localhost:3000/sse
上面的命令表示发送 10000 个请求,每次并发 100 个请求,请求头中包含
Accept: text/event-stream。使用 Apache JMeter 工具进行测试:
- 添加一个 HTTP 请求,默认请求头中包含
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,需要手动添加Accept: text/event-stream。 - 添加一个监听器,选择 SSE Sample 类型。
测试结果可以查看响应时间、吞吐量、错误率等指标。
- 添加一个 HTTP 请求,默认请求头中包含
订阅投递的性能测试
订阅投递的性能测试主要测试 SSE 在订阅和投递消息时的性能表现。测试方法可以采用 Apache JMeter 工具。
- 添加一个 HTTP 请求,默认请求头中包含
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,需要手动添加Accept: text/event-stream。 - 添加一个监听器,选择 SSE Sample 类型。
- 添加一个定时器,设置每隔一定时间向服务器发送一条消息。
- 测试结果可以查看响应时间、吞吐量、错误率等指标。
SSE 的示例代码
下面是一个使用 Node.js 实现 SSE 的示例代码:
// www.javascriptcn.com code example
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/sse') {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
setInterval(() => {
const data = `data: ${new Date().toString()}\n\n`;
res.write(data);
}, 1000);
} else {
res.writeHead(404);
res.end();
}
}).listen(3000);上面的代码创建了一个 HTTP 服务器,当客户端请求 /sse 路径时,会返回符合 SSE 规范的数据。服务器每秒钟向客户端发送一条消息,消息内容为当前时间。
客户端可以使用以下代码接收 SSE 数据:
const eventSource = new EventSource('/sse');
eventSource.addEventListener('message', event => {
console.log(event.data);
});上面的代码创建了一个 EventSource 对象,监听 /sse 路径的 SSE 数据。每当服务器发送一条消息时,会触发 message 事件,事件对象中包含消息内容。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d15470a941bf71342d2d67