我们在 GAE/J 应用程序中使用会话。上周末,我们的数据存储写入出现大幅峰值,这似乎是由于创建了大量 _ah_SESSION 实体(每分钟大约 100-200 个)造成的。正如我们所知,有一个流氓任务队列创建它们,因为当我们清除队列时它们停止了。该任务是我们每小时运行的映射器进程的一部分。
我们不需要该每小时映射器中的会话(或者实际上在我们的任何任务队列或 cron 作业或许多其他请求中)。有没有办法禁用为选定的 URL 创建会话?
我们在 GAE/J 应用程序中使用会话。上周末,我们的数据存储写入出现大幅峰值,这似乎是由于创建了大量 _ah_SESSION 实体(每分钟大约 100-200 个)造成的。正如我们所知,有一个流氓任务队列创建它们,因为当我们清除队列时它们停止了。该任务是我们每小时运行的映射器进程的一部分。
我们不需要该每小时映射器中的会话(或者实际上在我们的任何任务队列或 cron 作业或许多其他请求中)。有没有办法禁用为选定的 URL 创建会话?
不幸的是,这是无法做到的。
当您有一个非浏览器客户端(通过 REST 或 mapreduce 作业的设备)时,这尤其令人讨厌,其中每个请求都会_ah_SESSION
在数据库中生成一个新实体。
避免这种情况的唯一方法是编写自己的会话处理程序:例如,设置/检查 cookie 并将其设置为忽略某些路径的 servlet 过滤器。
编辑:
我刚刚意识到可能还有另一种方法:确保您的客户端(mapreduce 作业)设置一个具有正确名称的虚拟 cookie。GAE 使用ACSID
在生产和dev_appserver_login
开发服务器上命名的 cookie。只需始终使用相同的 cookie 值,因此所有请求都将被视为一个用户/会话。
查找/保存会话对象仍然会有开销,但至少它不会创建无数_ah_SESSION
实体。