据报道,Erlang已在生产系统中使用了20多年,正常运行时间百分比为99.9999999%.
我做了以下数学计算:
20*365.25*24*60*60*(1 - 0.999999999) == 0.631 s
Run Code Online (Sandbox Code Playgroud)
这意味着系统在20年期间只有不到一秒的停机时间.我并不想挑战这个问题的有效性,我只是好奇我们如何关闭系统(故意或偶然)只有0.631秒.任何熟悉大型软件系统的人都可以向我们解释这个吗?谢谢.
有谁知道如何计算服务在一组处理单元(或机器)上的停机时间?
长版:
我是erlang的新手,并考虑将其用于可扩展的架构.我发现该平台的许多支持者都在宣传其可靠性和容错性.
但是,我很难准确理解在这个消息在瞬态内存中排队的系统中如何实现容错.我知道可以安排一个主管层级来重新生成已故的流程,但我一直无法找到很多关于重生工作对正在进行的工作的影响的讨论.在飞行中的消息和在垂死节点上丢失的部分完成的工作的工件会发生什么?
当消费者进程死亡时,所有生成器是否会自动重新传输未被确认的消息?如果没有,这怎么可以被认为是容错的?如果是这样的话,是什么阻止了被处理的消息 - 但不是很确认 - 被重新传输,因此不适当地重新处理?
(我认识到这些问题不是erlang独有的;在任何分布式处理系统中都会出现类似的问题.但是erlang爱好者似乎声称平台让这一切变得"简单"......?)
假设重新传输消息,我可以很容易地想象出一个复杂的消息链的下游影响在发生故障后可能变得非常混乱的情况.如果没有某种繁重的分布式事务系统,我不明白如何在不解决每个进程中的重复的情况下保持一致性和正确性.我的应用程序代码是否必须始终强制执行约束以防止事务被多次执行?
精简版:
分布式erlang进程是否受重复消息的影响?如果是这样,是重复保护(即,幂等)应用程序的责任,还是erlang/OTP以某种方式帮助我们?
我需要一种方法来监控用户编辑会话,我正在审查的解决方案之一将让我使用unload
事件发送ajax请求以通知服务器编辑会话结束.(请参阅:监控用户会话以防止编辑冲突)
我对unload
事件的(相当有限的)读取表明附加到此处理程序的代码必须快速运行,因此通常用于清除对象以防止内存泄漏.
我的问题是,这可以为此目的提供足够的可靠性吗?
PS.我知道这个async: false
选项.
这似乎是一个非常明显的,基本的东西,期待从图谱API,但我遇到了严重的困难.我想要做的就是获取任何特定URL的ID.他们有一个方法:
https://graph.facebook.com/?ids=http://www.imdb.com/title/tt0117500/
Run Code Online (Sandbox Code Playgroud)
这很有效.但如果我尝试另一个网址,比如我的博客,
https://graph.facebook.com/?ids=http://dusda.vox.com
Run Code Online (Sandbox Code Playgroud)
它没有像我所有的例子那样给我一个数字ID.相反,这个:
{"http:\/\/dusda.vox.com":{"id":"http:\/\/dusda.vox.com"}}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用那个"id",我会得到插孔(可能是因为查询字符串看起来无法解析):
Request: https://graph.facebook.com/http://dusda.vox.com/likes
Response: {"id":"http:\/\/dusda.vox.com\/likes"}
Run Code Online (Sandbox Code Playgroud)
那么这有什么用呢?Graph API是选择性可靠的,还是我误解了什么?我已经尝试过我知道在Facebook上流行的网址,而且我的结果好坏参半.
Env Redis 2.8.17
我们使用类似于redis文档中描述的模式在RPOPLPUSH下实现了可靠的队列
但是,我们使用BRPOPLPUSH考虑其阻塞性质,并使用LPUSH来确保FIFO顺序.
生产者:使用LPUSH推送项目的多个线程(来自多个服务器).
消费者:使用BRPOPLPUSH处理项目的多个线程(来自多个服务器).
BRPOPLPUSH q processing-q
Run Code Online (Sandbox Code Playgroud)
如记录所示,redis从队列'q'弹出项目,同时在'processing-q'中添加它们.
由于我们的应用程序具有多线程(异步)特性,因此当消费者完成处理时,我们无法控制.
因此,如果我们使用LREM(根据文档)从processing-q中删除已处理的元素,这将只删除处理q的顶部元素.在哪里无法保证,是否已经删除了由相应消费者处理的实际元素.
因此,如果我们不做任何事情,处理-q继续增长(吃掉记忆),这是非常糟糕的恕我直言.
有什么建议或想法吗?
我们的产品是分布式系统.我工作的模块相当新,非常严格,经过严格测试.它们是根据最近的最佳实践开发的.其他模块可以视为传统软件.
虽然我对我负责的模块中发生的所有事情保持警惕,但我仍然面临着处理从其他模块发送给我的不良数据的压力.从本质上讲,我是一个"快速失败"原则的开发人员,因此,当问题出现时,我通常能够消除模块中出错的可能性.这不仅仅是责备,只是在错误的地方浪费精力去追逐虫子.
但我不断反对的论点是:"我们不能让这些东西在生产中失败,客户希望这个能够发挥作用,为什么你不解决这个问题".这将是一个强大的论据:你接受的是自由的,你发送的是保守的.
我还应该注意到,这些主要是间歇性的问题.我们在集成测试中看到它们,但它们很难重现.涉及时间和并发.
我很难在这两个原则之间取得平衡.部分原因是我担心,如果我开始允许和传播特殊数据,我会引起麻烦,我对系统的信心也不会那么高.但即使其他模块向我发送错误的数据,我也不能反对保持系统正常工作.其他模块没有得到修复的原因是它们太复杂和脆弱,而我的仍然显得清晰和安全.但是,如果我不抵抗压力,我的模块将慢慢地背负着我一直拒绝的同样问题.
我应该说系统没有在生产中"崩溃",但是我的模块可能只是向操作员显示错误并要求他们联系支持人员.崩溃将是一个大问题,但如果我清楚地报告错误,那么这不是正确的做法吗?我怀疑我的同行只是不希望客户看到任何问题,期间.但是我的模块拒绝了我们产品中其他模块的数据,而不是客户输入.所以在我看来,我们只是没有解决问题.
那么,我是否需要更务实或坚持自己的立场?
我一直在为我的公司试用Bizspark/Azure产品.当我们意外地超过我们的免费使用限制1c时,Microsoft删除了我们的VM并将我们的IP地址交给其他客户.这是在几个小时内立即完成的,没有事先警告.DNS更改为我们的新IP地址传播花了三天时间,在此期间,访问我们网站的任何人都看到了随机其他Azure客户的网站.
我们鼓励我们在测试期间设置零消费限额,但我们已为该帐户注册了公司信用卡.服务条款表明,如果超过消费限额服务暂停会发生,但是这不是服务的悬浮液,可以迅速提升,这是一个永久性的去除我们得到3天的业务中断和IP地址从我们的临时磁盘等删除数据
我们的服务没有投入生产; 他们正在试生产.然而,管理层现在担心这样的事件可能会发生,并询问微软是否真的知道它在做什么,因为亚马逊EC2知道它在做什么.我现在已经在Azure投入了时间,但我也很担心.
我的问题是:Microsoft是否为Azure客户提供静态IP地址,这些IP地址在服务器升级,计费问题或其他小问题期间不会丢失?可以通过设置Azure虚拟网络来完成吗?当服务暂停可以立即以可逆方式(例如阻止端口)轻松执行时,为什么Microsoft会对客户采取这种破坏性行动?
Azure是运行可靠服务器的可行平台吗?
我的Azure角色从数据库中抓取要处理的内容 - 它包含一个实例System.Data.SqlClient.SqlConnection
并定期创建SqlCommand
实例并执行SQL查询.
现在偶尔(通常是几天一次)运行查询将触发SqlException
异常
该服务在处理您的请求时遇到错误.请再试一次.错误代码40143.当前命令发生严重错误.结果(如果有的话)应该被丢弃.
我已经见过很多次,现在我的代码捕获它,呼吁Dispose()
对SqlConnection
实例,然后重新打开连接和试查询.后者通常会导致另一个SqlException
例外
超时已过期.操作完成之前经过的超时时间或服务器没有响应.
这看起来非常像SQL Azure服务器无响应或因任何原因无法使用.
目前我的代码没有捕获后一个异常,它在外部传播RoleEntryPoint.Run()
并重新启动角色.重启通常需要大约十分钟,一旦完成,问题就会消失一天左右.
我不喜欢我的角色重新启动 - 这需要一段时间,我的服务功能受到阻碍.我想做一些更聪明的事情.
解决这个问题的策略是什么?我应该多次重试查询多少次以及间隔多少次?我应该做别的吗?我什么时候放弃并让角色重启?
我正在编写一个体育应用程序,需要跟踪季度/半/周期的流逝时间.经过的时间需要精确到秒.即使用户通过按下电源按钮明确地将设备置于睡眠模式,游戏时钟也需要继续运行.
我第一次尝试使用Handler.postDelayed()来触发每200ms的时钟滴答和WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON,以确保屏幕超时不会停止"时钟".但我很快了解到,这是可以通过按下电源按钮手动把睡觉的装置来规避这种方法.此外,postDelayed()方法正在经历一些时钟漂移,显然是在run()方法中花费的时间的结果.实际数字仍然是准确的,但不是对齐,例如,在用户容易理解的5秒边界上 - 所涉及的定时器开始漂移,导致一些可理解的用户混淆.
经过一番研究后,我找到了使用服务,java定时器,AlarmManager和PartialWakeLock来实现定时器的技术.服务本身不能解决与设备进入睡眠状态相关的问题.Java定时器(如服务)无法解决设备进入休眠状态的问题.AlarmManager似乎是一个很好的方法,但我担心这不适合使用AlarmManager(即报警之间的间隔非常短).使用PartialWakeLock也看起来很有希望,但它本身并没有解决时钟漂移问题,我遇到了.
我将尝试组合AlarmManager和PartialWakeLock.我们的想法是,AlarmManager将有助于对抗时钟漂移和PartialWakeLock,以帮助保持代码简单(手指交叉).我希望这种方法能够在节能,代码复杂性和用户期望之间取得合理的平衡.任何意见是极大的赞赏.
谢谢,
丰富
这两个时间函数中哪一个更好?
我的网站上有一个表单,每隔几微秒或更短时间由数千名用户提交,因此,我的服务器上同时有数千个请求.
所以我想使用执行时不使用任何睡眠的那个.此外,如何独特之处是$_SERVER['REQUEST_TIME']
和time()
?每两微秒都会改变吗?
每次提交表单时,$ _SERVER ['REQUEST_TIME']会改变吗?就像,time()函数会在每个时间差异时发生变化.
我需要为用户提供一个唯一的URL进行验证,其中附加了两者中任何一个生成的唯一结果?另外,使用microtime()会让PHP睡眠吗?不是吗?
reliability ×10
azure ×2
erlang ×2
performance ×2
.net ×1
ajax ×1
android ×1
clock ×1
downtime ×1
events ×1
javascript ×1
messaging ×1
persistent ×1
php ×1
queue ×1
redis ×1
robustness ×1
sql-server ×1
time ×1
timer ×1
transactions ×1
uptime ×1