ppt演讲主题有哪些:CometD JavaScript 消息批处理

来源:百度文库 编辑:中财网 时间:2024/04/28 09:33:12

原文地址:

                  http://cometd.org/documentation/cometd-javascript/batching

 

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() 里面的函数调用这3publish()

或者可以,但比较不推荐这样:您也可以在startBatch() endBatch() 之间围绕3publish() 来调用。

 

 

警告

请记住在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 执行结束批处理。