ppt演讲主题有哪些:CometD JavaScript 消息批处理
来源:百度文库 编辑:中财网 时间:2024/04/28 09:33:12
原文地址:
CometD JavaScript 消息批处理
sbordet提交的 于星期四,2009/7/2-10:25。
JavaScript CometD API: 消息批处理
应用程序通常可能需要向不同的频道发送几个消息。
一种天真的做法,方式如下所示:
cometd.handshake();
// Warning: non-optimal code
cometd.publish('/channel1', { product:'foo' });
cometd.publish('/channel2', {notificationType: 'all' });
cometd.publish('/channel3', { update: false});
你可能认为这3 个发布将一个接着另一个离开客户端,但实际上不是这样。
请记住,publish() 是异步的(所以他会立即返回),所以这3个 publish() 在调用序列中将在点击网络之前可能返回单个字节。
第1个 publish() 将会立即执行,而其他第2个将会被放在队列中,等待第1个 publish()的完成,这样会发生什么情况?
当服务器接收到一个publish()时,服务器会发送回元数据响应,且客户端会收到元数据响应,这样一个publish()就发布完成了。
完成第1次发布后,第2个发布被执行并等待完成。最后,第3个 publish() 被执行。
自 CometD 1.1.2,可以设置一个称为 autoBatch 的新配置参数为 true,从而实现了自动批处理已排队的消息。
所以,在上面的示例中,第1个 publish() 将会立即执行,完成后,实现将批处理第2和第3个 publish() 形成一个请求发送到服务器。
有些事件系统对AutoBatch 功能可能很有趣,这些事件的接收是异步和不可预测,要么快速或爆发的,最终生成publish()发布在服务器上:在这种情况下,使用批量 API 不是有效(每个事件将生成唯一的 publish())。
在客户端上爆发的事件将生成爆发的 publish() 发布到服务器,但这一批量机制,他们是自动,使通讯更加高效。
为避免排队的 publish()背后的长轮询,需要这种排队机制。如果没有为这一机制,浏览器将收到 3 个发布请求,但只有 2 个连接可用,还有一个已被长轮询请求占用。所以,浏览器可能会决定轮循发布请求,这样第1个发布继续第2个连接(记住第1个连接已是忙着长轮询请求),它免费且实际发送到网络上,安排第2个发布到第1个连接上(在长轮询返回之后),在第1个发布返回之后再次安排第3个发布到第2个连接上。
其结果是:如果你有 5 分钟的长轮询超时,第2个发布请求迟于第1个和第3次发布请求5 分钟到达服务器。
您可以使用批处理优化这3个发布,这批处理是一种对消息进行分组结合的种方式,即:以单个 Bayeux 消息承载这3个发布消息。
cometd.handshake();
cometd.batch(function()
{
cometd.publish('/channel1', { product: 'foo' });
cometd.publish('/channel2', { notificationType: 'all' });
cometd.publish('/channel3', { update: false });
});
// 或者可以这样,但不建议
cometd.startBatch()
cometd.publish('/channel1', { product:'foo' });
cometd.publish('/channel2', {notificationType: 'all' });
cometd.publish('/channel3', { update: false});
cometd.endBatch()
请注意,这里是如何通过batch() 里面的函数调用这3个publish() 。
或者可以,但比较不推荐这样:您也可以在startBatch() 和 endBatch() 之间围绕3个publish() 来调用。
警告
请记住在startBatch() 后调用 endBatch()。
如果你不这样做,会在批处理中引发异常,您的消息将继续排队,这和您的应用程序预期的不一样。
函数 batch() 已经为您正确的批处理消息(即使是在有错误的情况下),所以这是推荐的批处理消息的方法。
当启动批处理时,后续的 API 调用不会发送到服务器,代替了排队等候,直到批处理结束。
最后将所有排队的消息批处理包成一个单一 Bayeux 消息,通过网络将其发送到 Bayeux 服务器。
批处理消息允许有效利用网络,使本来的3个请求/响应周期变成只有一个请求/响应周期。
批处理可以由不同的 API 调用组成:
var _subscription;
cometd.batch(function()
{
cometd.unsubscribe(_subscription);
_subscription = cometd.subscribe('/foo', function(message) { ... });
cometd.publish('/bar', { ... });
});
成批的消息将由 Bayeux 服务器按他们发送的顺序处理。
如果您仍要风险的调用 startBatch() 和 endBatch(),请记住他们必须从同一上下文中执行;消息批处理不设计成跨越多个用户的交互。
所以,例如,像这样的错误:在functionA(由用户交互引发的)开始批处理,而在functionB中结束批处理(也是由用户交互引发且没有被functionA调用)。
同样地,像这样的错误:functionA启动批处理,然后安排 (使用setTimeout()) functionB 执行结束批处理。