我有一个运行多个应用程序服务器的在线服务,其中有几个集合存储在 MongoDB 中。我以持续部署的方式工作,这基本上意味着如果一切顺利,代码更新会触发自动化测试,然后进行生产升级(这让事情变得有点复杂,但我相信这个问题也与非 CD 部署相关)。
这在大多数情况下都有效,但有时我的一个(或多个)核心数据模型会发生变化,在这种情况下,升级可能会弄乱内存中的数据,然后再弄乱数据库中的数据。
我举个例子:
假设我有一个简单的数据对象:
public class User {
private String id;
private String name;
private String[] friendsNames;
}
现在我决定将用户更改为:
public class User {
private String id;
private String name;
}
并将 friend 添加为一个单独的集合,它存储一个简单的对象,例如:
public class Friend {
private String name;
private String friendUserId;
}
这导致了一个问题。在更改数据结构以适应新数据模型之前我不能升级我的服务,在我关闭服务之前不能更改数据,否则旧版本将读取新数据版本并弄乱。
因此唯一的解决方案是关闭所有内容,在数据库上运行一些升级过程以更改所有内容,然后在运行新代码的情况下恢复服务。
所以最后的问题是:我想知道是否有版本数据的最佳实践解决方案(如果相关,特别是 Mongo),以便旧版本的应用程序能够继续使用旧数据,而新的应用程序将“见”新数据。我想到了像“UserV1.1”和“UserV1.2”这样的类版本,它们会在 mongo 中搜索合适的类版本,但如果有人已经想到并提出来,我不想“重新发明轮子”使用智能解决方案。
明确一点,我不关心对象历史,我只希望能够顺利升级应用程序版本。
最佳答案
欢迎来到“无模式”的乐趣。在我的应用程序中,我最终对对象进行了编码,以便它们可以经历“过渡”时期。也就是说,任何更改模型的版本都必须同时支持旧的和新的“模式”。我将这些比特投入生产,然后开始漫长的过程,将所有东西都转换过来。下一个版本,我们取消了过渡逻辑。它的屁股很痛,但它有效。更改架构需要两个版本。
关于java - 代码升级之间的 Mongodb 和 java 数据版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14953607/
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.