我正在考虑用ServiceStack服务器事件替换我们的定期轮询网页,但是在查看行为时,服务器事件机制实际上比我们正在做的更多开销 - 在我们的情况下返回消息是几百字节并且每五秒只进行一次民意调查 - 相对于每隔几秒496字节的心跳,事件流长调查看起来甚至超过平均值。每个客户端可能合计2-3Kbps。
我不太关心延迟,但我确实关心传输的连接数和字节数。是否有任何配置使基于javascript的客户端更有效率?
var source = new EventSource(
'/event-stream?channel=someUpdate&t=' + new Date().getTime());
$(source).handleServerEvents({
receivers: {
some: {
Update: function(id) {
alert(id);
}
}
},
});
答案 0 :(得分:2)
SSE服务器事件连接仅使用每个订阅的单个长期HTTP连接,并且事件本身比轮询更有效,因为它只发送事件数据而不是开销每次都有新的HTTP请求和重复的HTTP标头。
听起来你正在测量用于检测SSE连接是否仍然存活的心跳uses the following defaults:
IdleTimeout = TimeSpan.FromSeconds(30);
HeartbeatInterval = TimeSpan.FromSeconds(10);
请注意,每个客户端的心跳数保持不变,即它们不会更改连接的客户端是否每秒接收多个事件 - 客户端仍然每10秒发送1次心跳。
我们有客户使用这些默认值处理数千个并发连接但您可以在注册ServerEventsFeature
时更改心跳间隔,例如,您可以将间隔加倍:
Plugins.Add(new ServerEventsFeature {
IdleTimeout = TimeSpan.FromSeconds(60),
HeartbeatInterval = TimeSpan.FromSeconds(20),
});
答案 1 :(得分:2)
为了减少心跳带宽,您可以覆盖ServerEventsFeature
OnCreated
方法去除默认profileUrl
,因为这可能是心跳事件的一小部分。每心跳带宽的条款,假设您没有使用它。例如,
Plugins.Add(new ServerEventsFeature
{
StreamPath = "/event-stream",
HeartbeatPath = "/event-heartbeat",
UnRegisterPath = "/event-unregister",
SubscribersPath = null,
LimitToAuthenticatedUsers = false,
NotifyChannelOfSubscriptions = false,
OnCreated = (subscription, request) =>
{
subscription.Meta.Remove(AuthMetadataProvider.ProfileUrlKey);
}
});