小编drh*_*yes的帖子

App Engine,交易和幂等性

请帮我找出我的误会.

我在App Engine上写了一个RPG.玩家采取的某些行动会消耗一定的数据.如果统计数据达到零,则玩家不再采取行动.不过,我开始担心会欺骗球员 - 如果一名球员很快就发出了两个动作,那就紧挨着了?如果递减stat的代码不在事务中,则玩家有机会执行两次动作.所以,我应该在事务中包装减少stat的代码,对吧?到现在为止还挺好.

但是在GAE Python中,我们在文档中有这个:

注意:如果您的应用在提交交易时收到异常,则并不总是意味着交易失败.在已提交事务并最终成功应用事务的情况下,您可以收到Timeout,TransactionFailedError或InternalError异常.尽可能使数据存储区事务处于幂等状态,这样,如果重复某个事务,最终结果将是相同的.

哎呦.这意味着我运行的函数看起来像这样:


def decrement(player_key, value=5):
  player = Player.get(player_key)
  player.stat -= value
  player.put()
Run Code Online (Sandbox Code Playgroud)

嗯,这不会起作用,因为事情不是幂等的,对吧?如果我在它周围放置一个重试循环(我需要在Python中吗?我已经读过我不需要在SO上...但我在文档中找不到它)它可能会增加两次值,对?由于我的代码可以捕获异常,但数据存储仍然提交数据......呵呵?我该如何解决?这是我需要分布式交易的情况吗?我真的吗?

python google-app-engine transactions

7
推荐指数
1
解决办法
1372
查看次数

功能反应式编程中的数据建模

我觉得我能很好地处理功能反应式编程(FRP)"小",例如将鼠标事件组合成一个"拖动"事件流,或者将WebSocket事件映射和过滤成UI可以响应的可用对象.

但似乎我读过的FRP资源打算将它用作应用程序的主要数据模型.那部分我没有得到.

首先,FRP可以用作应用程序的主要数据模型吗?

是否存在全局事件流,其事件是模型的所有更改?该模型和那些事件必须包含应用程序中可能发生的所有事情.或者也许模型可以分成更小的位(Facebook的Flux架构中的商店)......但是这不仅仅是以一种非常奇怪的方式存储状态并提取语义技巧吗?

这是一个具体的例子.我正在制作像Tiled这样的tilemap编辑器应用程序.tilemap是图层列表.每层都有一个二维瓷砖阵列.每个地图,图层和图块都可以拥有自己的关联属性,UI在更改时必须表示这些属性.

这些东西中的每一个都是一个流,所以在顶层我有流的流吗?或者,我的应用程序的不同部分是否有单独的事物流(图层流,图块流)?

瓦片流看起来像什么?每个事件是一个带有关联图块的"添加图块"或"删除图块"命令吗?或者也许每个事件都是整个2d阵列可能会变大?如何利用FRP在此模型中的"时间旅行"优势?

我错过了一些更大的画面吗?

frp

7
推荐指数
0
解决办法
166
查看次数

客户端JavaScript中多个Firebase连接的资源限制

假设我想制作一个完全在浏览器中运行的大型,实时,2d开放世界风格的游戏,我想使用Firebase来完成它.

我们也要忽略安全方面的问题; 我稍后会问.(=

玩家从(0,0)开始,可以向任何方向移动.我在空间上对世界进行散列,以便任何给定的x,y坐标成为我可用于生成Firebase ref的单个(或嵌套)键:

var getKey = function(x, y) {
  return Math.floor(x / 100) + ':' + Math.floor(y / 100);
}

var key = getKey(currX, currY);

var ref = new Firebase('https://whatever.firebaseio.com/world/' + key);
// ...
Run Code Online (Sandbox Code Playgroud)

这样的事情.当玩家在世界各地移动时,我非常确定我需要保留4到9个参考值,以使Firebase保持活跃状态​​以进行更改.这可能会增加一倍或三倍,这取决于我如何构建数据:是否存储在world/树中或其他地方的其他玩家?那种事.

我不希望播放器的浏览器获得它不关心的更新.当玩家四处移动时,我想"过期"旧的参考,因此浏览器不会花费资源聊聊世界上遥远的片段.

是否足以让ref实例超出范围并获得GCed?或者还有什么我必须做的事情来通知裁判我不想再使用它了吗?

我想到的另一件事并不是担心有多少参考,而是追踪on回调.当玩家离开世界特定区域的范围时,我可以进行off任何回调.这足以让我的裁判停止与Firebase交谈吗?

javascript web-applications firebase

3
推荐指数
1
解决办法
885
查看次数