Erlang(根据定义,也就是 Elixir)的特性之一是您可以进行代码热交换。但是,这似乎与 Docker 不一致,您需要停止实例并使用包含新代码的新镜像重新启动新实例。这基本上似乎是每个人都在做的事情。
话虽如此,我也知道可以使用一个隐藏节点通过网络将更新分发给所有其他节点。当然,这样听起来像是自找麻烦,但是……
我的问题如下:有没有人尝试过为 Erlang/Elixir 建立一个允许热代码交换的基于 Docker 的基础架构并取得了相当大的成功?如果是,有哪些注意事项、注意事项和注意事项?
最佳答案
故事
想象一个系统来处理手机通话或移动数据访问(这就是创建 Erlang 的目的)。有网关服务器在通话期间维护用户 session ,或数据访问 session (我将其称为向前的 session )。只要 session 处于事件状态(用户已连接),这些服务器就会在内存中表示 session 。
现在有另一个系统可以计算向用户收取的通话费用或传输数据的费用(称为 PDF - Policy Decision Function)。两个系统的连接方式是网关服务器创建少量到 PDF 的 TCP 连接,如果这些 TCP 连接断开,它会丢弃用户 session 。网关一次可以处理几十万客户。每当发生需要向用户收费的事件(下一次数据传输,另一分钟的通话)时,网关都会通知 PDF 该事实,并且 PDF 从用户帐户中减去特定金额。当用户帐号为空时PDF通知网关断开通话(你的钱用完了,你需要充值)。
您的问题
最后让我们在这个背景下谈谈你的问题。我们要升级一个 PDF 节点并且该节点正在 Docker 上运行。我们用新版本的软件创建了一个新的 Docker 实例,但是我们无法关闭旧版本(有数十万客户在他们的通话中,我们无法断开他们的连接)。但是我们需要以某种方式将客户从旧 PDF 转移到新版本。因此,我们告诉网关节点创建与更新节点而不是旧 PDF 的任何新连接。客户可能很健谈,而且他们中的一些人可能有长时间运行的数据连接(下载 Windows 10 iso),因此整个操作需要 2-3 天才能完成。这是在出现严重错误时将软件的一个版本升级到另一个版本所需的时间。像这样的服务器可能有几十台,每台都处理数十万客户。
但是如果我们使用 Erlang 发布处理程序来代替呢?我们使用新版本的软件创建 relup 文件。我们对其进行正确测试并部署到 PDF 节点。每个节点都在原地升级——应用程序的内部状态被转换,节点正在运行新版本的软件。但最重要的是,与网关服务器的 TCP 连接并没有断开。因此,在我们升级系统的同时,客户可以愉快地继续通话或下载最新的 Windows iso。全部在 10 秒内完成,而不是 2-3 天。
答案
这是具有特定要求的特定系统的示例。 docker 和 Erlang's Release Handling是正交技术。您可以使用其中一个或两个,归结为以下几点:
您是否有足够的资源以可预测的方式测试这两种方法,并有足够的耐心来教导您的 Ops 团队,以便他们可以使用任何一种方法部署系统?如果测试设施耗资数百万英镑(因为需要硬件)并且一次只能使用这两种方法中的一种(因为测试周期需要几天时间)怎么办?
务实的方法可能是最初使用 Docker 部署节点,然后使用 Erlang release handler 升级它们(如果您首先需要使用 Docker)。或者,如果您的系统在升级期间不需要可用(如示例 PDF 系统所做的那样),您可能只是选择始终使用 Docker 部署新版本而忘记发布处理。或者,如果您需要快速可靠的即时更新并且 Docker 仅用于初始部署,您也可以坚持使用发布处理程序并忘记 Docker。我希望这会有所帮助。
关于docker - Docker 上的 Erlang/Elixir 和热代码交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173583/
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在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
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和