我试图弄清楚如何使用akka管理用户游戏状态.
游戏状态将持久保存到mysql,这不会改变,因为我们有其他需要此服务.
游戏中发生的任何事情都被视为"事件".
那么你我有一个人可以达到的"水平".完成与其关联的所有"事件"后,将达到一个级别.
所以你有了:
Level
- event1 e.g. reach a point in the game
- event2 e.g. pickup a sword
- event3 e.g. defeat a monster
Run Code Online (Sandbox Code Playgroud)
所以在游戏中有很多级别,以及与级别相关的100个事件.
所以所有"事件"都通过HTTP发送到我的后端,我将事件保存在数据库中.
然后我必须在内存中加载用户游戏配置文件,然后重新计算自发生新事件以来所达到的等级. 注意:这个计算不能在数据库级别完成,因为我在这里写的有点复杂.
我看到的问题是,如果我使用akka,我不能让多个actor为同一个用户处理事件,因为数据可能变得陈旧.
为了清楚起见,所以当一个新事件到来时,我必须在内存中加载游戏配置文件,遍历各个级别并查看是否已经实现了它们,如果有,则更新数据库
e.g. update levels set achieved=true where level_id = 123 and user_id=234
Run Code Online (Sandbox Code Playgroud)
例如,actor1加载配置文件(该用户的所有级别和事件),然后处理刚到达收件箱的新事件.同时,actor2加载配置文件(与actor1相同),然后处理新事件.当它持续更改mysql时,数据将不在sych中.
如果我使用线程,我将不得不在游戏配置文件计算期间锁定并持久保存到数据库.
我怎样才能使用Akka做到这一点并能够并行处理,或者这个场景是不允许的?
我真的很想使用vim插件,但是在安装它之前,我只想知道打开/关闭它有多容易?
它会弄乱任何键绑定吗?或者当我打开/关闭它时,它会很好地还原所有内容而没有问题吗?
我只是比较如何在java中将对象序列化和反序列化为JSON.
ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'john smith'}";
User user = mapper.readValue(jsonInString, User.class);
Run Code Online (Sandbox Code Playgroud)
使用Playframework和Scala,我必须创建这些读取和写入映射器,它们非常冗长.(参见:https://www.playframework.com/documentation/2.5.x/ScalaJsonHttp)
为什么它不能像java w/Jackson一样"工作"?
我有我的模型,我想简单地读/写然后到JSON.使用Java,我没有任何样板代码可供编写.
你打电话的时候
Await.result(myFuture, DURATION)
Run Code Online (Sandbox Code Playgroud)
在播放应用程序内部,当持续时间到期时,幕后会发生什么?
netty是否会在/返回时忽略响应?
当你为宽行和瘦行设计表时,有人可以给出并告诉我数据是如何布局的.
我不确定我是否完全掌握数据如何以"宽"行展开.
在如何获取数据方面是否存在差异,或者它是否相同,即如果它是有序的,则数据是垂直(瘦)还是水平(宽)组织无关紧要.
更新 是否考虑了主键是否包含多个列?或者,只有当分区键是复合分区键时,表才会有宽行?
如果"inStock"键存在并且列表中的所有值都为真,我想返回true.如果没有,则返回false.
val product = Map("ids" -> List("1" ,"2", "3"), "inStock" -> List("true", "false", "true", "true"))
product.get("inStock").map(x => x.forall(true)) // doesnt' work currently
<console>:13: error: type mismatch;
found : Boolean(true)
required: String => Boolean
Run Code Online (Sandbox Code Playgroud)
我还应该安全地将字符串值解析为布尔值,如:
Try(x.toBoolean)
Run Code Online (Sandbox Code Playgroud) val s = Set("blue", "orange")
val m = Map("product_orange_123" -> 1, "prodoct_blue_123" -> 2, "product_green_123" -> 5, "product_blue_887" -> 7)
Run Code Online (Sandbox Code Playgroud)
我想删除地图中不包含集合中任何值的任何键.
预期产量:
("product_orange_123" -> 1, "prodoct_blue_123" -> 2, "product_blue_887" -> 7)
Run Code Online (Sandbox Code Playgroud) 我使用较旧型号的MB Air和运行流浪者对我来说是非常耗费资源的.
在OSX上使用docker时,它是否只是在幕后使用vagrant在ubuntu上运行我的docker实例?
我遇到了反序列化JSON响应的问题.
userResponse = JsonConvert.DeserializeObject<UserResponse>(result);
Run Code Online (Sandbox Code Playgroud)
json响应如下:
{
"Results" : [
{
"Id" : 1,
"Name" : "John",
"Age" : 50
}
],
"Paging" : {
"TotalPages" : 5,
"CurrentPage" : 1
}
}
Run Code Online (Sandbox Code Playgroud)
我的UserResponse类假设绑定到上面的JSON,如下所示:
[DataContract]
public class UserResponse
{
[DateMember(Name = "Results" )]
public List<User> Results {get;set;}
[DateMember(Name = "Paging" )]
public Paging Paging {get;set;}
}
[DataContract]
public class User
{
public int Id {get;set;}
public string Name {get;set;}
public int Age {get;set;}
}
[DataContract]
public class Paging
{
public int …Run Code Online (Sandbox Code Playgroud) 因此,用户表有4000万行。如果没有WHERE子句,下面的查询将足够快地运行(不到1秒)。如果在查询中放入WHERE子句,则大约需要10分钟才能返回结果集。我在UserType列上添加了索引,但是由于某种原因,它似乎并未影响响应时间
CREATE INDEX idx_users_user_type ON Users (UserType);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT TOP 100
*
FROM Users u
INNER JOIN Company c ON c.ID = u.CompanyID
INNER JOIN Location l ON l.ID = u.LocationId
WHERE
u.UserType = 'manager'
Run Code Online (Sandbox Code Playgroud)
UserType只有3个值:
manager
employee
temp
Run Code Online (Sandbox Code Playgroud)
我不希望将列更改为INT值,因为ETL流程会将数据导入到现在很难更改的表中。