2

我正在使用send_message(client_id, message)ingoogle.appengine.api.channel来扇出消息。最常见的用例是两个用户。典型的跟踪如下所示:

痕迹

这两个调用send_message是独立的。我可以并行执行它们以节省延迟吗?

4

2 回答 2

1

好吧,没有可用的异步 api,因此您可能需要实现自定义解决方案。

您是否已经尝试过使用本机线程?它在理论上可以工作,但由于 GIL,xmpp api 必须被 I/O 阻塞,我不确定它是否会这样做。

自定义实现总是会带来一些开销,因此对于您的简单案例,它可能不是最好的主意,除非它破坏了 > 2 个用户案例的体验。

然而,还有另一个问题可能值得您花时间:如果实例崩溃并且只需要发送第一条消息会发生什么?该 api 不是事务性的,因此您应该有某种保护措施。考虑到这种情况很少发生,也许一个简单的恢复模式就足够了,但我愿意打赌事务性消息通道听起来更有吸引力,对吧?

有两种方法可以解决这个问题,我想不到:

  • 为每条消息推送一个任务,它们是事务性的并保证运行,并且将以相当相同的运行时间并行执行。它会增加第一条消息发出的时间,但会在所有消息之间保持一致。

  • 使用为这个确切的用例构建的服务,比如firebase(尽管它甚至可能太强大了,哈哈),根据我的经验,通道 api 不是很一致,并且对于游戏来说性能并不令人印象深刻,所以这可能会让你的系统更好。

于 2015-03-15T11:54:34.830 回答
1

为你解决了这个问题

我刚刚在googleappengine issue 9157上发布了一个补丁,并补充说:

  • channel.send_message_async用于向接收者异步发送消息。
  • channel.send_message_multi_async用于将单个消息异步广播给多个收件人。
  • 一些帮助方法使这些成为可能。

在将补丁推送到 SDK 之前,您需要包含该channel_async.py文件(附加在该线程上)。

用法

import channel_async as channel

# this is synchronous D:
channel.send_message(<client-id>, <message>)

# this is asynchronous :D
channel.send_message_async(<client-id>, <message>)

# this is good for broadcasting a single message to multiple recipients
channel.send_message_multi_async([<client-id>, <client-id>], <message>)
# or
channel.send_message_multi_async(<list-of-client-ids>, <message>)

好处

生产速度对比:

  • 同步模型:每个收件人2 - 80 毫秒(和阻塞-.-)
  • 异步模型:每个接收者0.15 - 0.25 ms
于 2015-05-18T22:59:03.847 回答