最近我一直在用docker compose进行一些实验,以便部署多个协作微服务.我可以看到微服务提供的许多好处,现在有一个很好的工具集来管理它们,我认为跳进微服务车并不是很难.
但是,我也一直在尝试Elixir,我非常喜欢它本身提供的好处.鉴于它鼓励将代码打包到多个解耦的应用程序中,并支持热代码升级,您如何将docker与elixir(或erlang)混合使用?
例如,如果我想使用docker因为它提供了dev-prod奇偶校验,那么elixir如何适应它?鉴于docker容器是不可变的,我失去了进行热代码升级的能力,对吗?蓝/绿部署或金丝雀发布怎么样?
我的意思是,我可以用Elixir编写微服务并使用它们就像用任何其他语言编写的那样,多语言无论如何都是微服务的好处之一,但是后来我没有得到使用OTP平台的全部好处,我猜测纯粹的协作erlang应用程序比使用中间队列在以不同(或非)语言编写的微服务之间进行通信更为优化.
我可能会用javascript来开发一个在线棋盘/纸牌游戏.我的方法是让客户端能够以独立模式工作,因此必须执行规则.这意味着,例如,如果玩家不能玩牌,他或她甚至不能玩它.这是为了增强用户体验.
这里的想法是添加钩子以发送和接收来自服务器的事件,并共享在服务器和客户端之间实现游戏规则的代码.我没有看到写两次的意思.
所以,如果我在"服务器"模式下播放时,客户端将更新自己的行为(验证他们也一样)的服务器,服务器将发送我的更新有关的其他玩家.
是否有任何框架可以利用这项工作?
对于服务器端,我的选择似乎是Node.js的(不稳定,但一切都将是JS,这就是纯),二郎+ erlang_js,也许有些怪异的那些框架,即"编译成JavaScript",我是真的没有喜欢.
我想在我的应用程序中使用一些库,比如https://github.com/Panmind/erlang-ruby-marshal.该repo拥有一个src目录,但没有.app文件(因为它不是一个应用程序),所以我不能使用get-deps.
我尝试了另一种方法,在sub_dirs中添加了一个libs目录,并将repo添加为git子模块,但是rebar不会编译它的任何文件.我猜这个rebar只编译otp应用程序,但不仅仅是编译与应用程序无关的.erl文件.
你如何管理这种依赖?我想避免将文件复制到我的app目录,因为我不认为它们属于那里,我有点像git子模块方法,它允许我跟踪我正在使用的lib版本.
我正在创建一个使用REST API的Android应用程序(我的第一个).我使用后台作业来获取内容,我计划使用带有from_id参数的GET请求以获取更多内容.当然,从API获取的任何东西都存储在SQLite数据库中(我正在使用greendao),而应用程序只使用已经存在的数据,以便更加快捷.
所以,问题是:如果在服务器上更新给定记录会发生什么?如果一旦读取的记录被缓存,应用程序将如何注意到有同步更改?哪种策略是可行的解决方案
谢谢.
编辑:
正如Satish P在他的回答中指出的那样,客户端 - 服务器通信是用ETag处理的(我必须添加使用If-Modified-Since的可能性).
但我主要担心的是如何将其与应用UI混合使用.鉴于这个例子:
问题:如果已填充详细视图,因为远程请求返回时已完成本地数据库读取,如何更新视图?我不认为只用更新的数据替换当前数据是可以接受的,用户会看到一个突然的变化.
假设我有这个课程:
public class PhotoRepository {
private PhotoDao db;
PhotoRepository(PhotoDao dao) {
db = dao;
}
public void save(List<Photo> photos) { db.insertOrReplaceInTx(photos); }
public List<Photo> all() { return db.loadAll(); }
public Photo get(Long id) { return db.load(id); }
}
Run Code Online (Sandbox Code Playgroud)
由于我有更多种类的实体,而不仅仅是Photo,我希望有一个通用的存储库,我可以通过任何类型的Dao.
我已经尝试使用Class<? extends AbstractDao<?, ?>>构造函数的参数,但编译器说de dao方法无法解析.这些方面的东西:
public class Repository<T> {
private Class<? extends AbstractDao<T, ?>> db;
Repository(Class<? extends AbstractDao<T, ?>> dao) {
db = dao;
}
public void save(List<T> items) { db.insertOrReplaceInTx(items); }
public List<T> all() { return db.loadAll(); } …Run Code Online (Sandbox Code Playgroud) erlang ×3
android ×2
architecture ×1
docker ×1
dry ×1
elixir ×1
game-engine ×1
generics ×1
java ×1
javascript ×1
mobile ×1
node.js ×1
rebar ×1
rest ×1
sqlite ×1