【问题标题】:How to decrease webSocket data flow in play framework 2.5.x如何在 play framework 2.5.x 中减少 webSocket 数据流
【发布时间】:2016-10-11 14:27:17
【问题描述】:

我正在开发一款浏览器游戏。

服务器端是在 Play Framework 2.5.x (scala) 上编写的。客户端(JS 应用程序)通过 websocket 与服务器通信。服务器大约每 250 毫秒向客户端发送消息。

问题是每个播放器的流量接近 16kB/秒,我想尽可能减少它。

每条消息都是玩家周围的序列化游戏状态,看起来像这样(实际的 json 更大,这只是说明想法):

{
"gameState": {
  "player": {
    "id": 218,
    "body": [[42, 20],[42, 21],[43, 21],[43, 20]],
    "name": "player",
    "color": 1,
    "isBot": false
  },
  "food": [[25, 25],[24, 25],[24, 24],[24, 23],[23, 23]],
  "enemies": [{
    "id": 217,
    "body": [[53, 46],[53, 47],[53, 48],[53, 49]],
    "name": "roBot#217",
    "color": 22,
    "isBot": true
    }]
  }
}

我阅读了几篇文章并认为我必须压缩发送给客户端的消息。因此,我尝试在 play applicaton 中通过 gzip 过滤所有响应:

@Singleton
class Filters @Inject() (gzipFilter: GzipFilter, implicit val materializer: Materializer)
extends DefaultHttpFilters(gzipFilter) {
  new GzipFilter(shouldGzip = (request, response) => {
response.header.headers.get("Content-Type").exists(_.startsWith("application/json"))
  })
}

但是这个过滤器不起作用。服务器仍然发送未压缩的数据。我做错了什么?

【问题讨论】:

  • 你也可以想出不同的策略来减少流量:发送更短的json(减少字段名),发送一个diff而不是full state,使用不同于json的格式(protobuf)
  • 我将重构 JSON 以使其尽可能短。但根据我的计算,它可以为我节省大约 2kB/秒。我会与您保持联系。

标签: playframework websocket gzip


【解决方案1】:

您是否添加了all settings 以启用 gzip 过滤器?

我看你没有提到这两点:

1) 将播放过滤器项目添加到您的libraryDependencies 中的build.sbt

libraryDependencies += filters

2) Filters 类可以在根包中,或者如果它有另一个名称或在另一个包中,则需要使用application.conf 中的play.http.filters 进行配置:

play.http.filters = "filters.MyFilters"

并尝试从Filter 中删除@Singleton - 过滤器文档中没有此注释,我在我的项目中也不使用它。

【讨论】:

  • 库依赖如下所示:libraryDependencies ++= Seq(jdbc,cache,ws,"org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test,filters)Filters 类在根包中。我删除了@Singleton 注释。过滤器仍然不起作用。
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多