无论好坏,我们已将整个LAMP Web应用程序从专用计算机迁移到云计算(Amazon EC2计算机).到目前为止它很好,但我们做crons的方式是次优的.我有一个特定于亚马逊的问题,关于如何使用"亚马逊方式"在云中最好地管理cron作业.
问题:我们有多个Web服务器,需要为批量作业运行crons,例如创建RSS提要,触发电子邮件,实际上有很多不同的事情.但是cron作业只需要在一台机器上运行,因为它们经常写入数据库,因此如果在多台机器上运行,则会复制结果.
到目前为止,我们将其中一个网络服务器指定为"主网络服务器",并且它有一些其他网络服务器没有的"特殊"任务.云计算的权衡是可靠性 - 我们不需要"主 - 网络服务器",因为它是单点故障.我们希望它们都是相同的,能够升级和缩小,而不记得不将master-webserver从集群中取出.
我们如何重新设计我们的应用程序以将Linux cron作业转换为没有单点故障的临时工作项?
我的想法到目前为止:
更新:自从问及我在YouTube上观看亚马逊简单工作流服务网络研讨会并在34:40(http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s)注意到的问题后,我看到了一个问题.幻灯片提到cron作为示例应用程序.在他们的文档页面" 亚马逊SWF的AWS Flow Framework样本 "中,亚马逊称他们有crons的示例代码:
... > Cron作业在此示例中,长时间运行的工作流会定期执行活动.可以证明能够继续执行新执行,以便执行可以运行很长一段时间....
我下载了适用于Java的AWS开发工具包(http://aws.amazon.com/sdkforjava/),并确保在一个荒谬的文件夹层中埋藏了一些java代码(aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow).
问题是,如果我是诚实的,这并没有真正的帮助,因为它不是我能用我的技能组合轻易消化的东西.PHP SDK中缺少相同的示例,并且似乎没有可以通过该过程的教程.所以基本上,我还在寻找建议或提示.
我正在寻找构建一个Web应用程序,它需要在R中按需运行资源密集型MCMC(马尔可夫链蒙特卡罗)计算,以便为用户生成一些概率图.
约束:
显然,我不希望在与Web应用程序前端相同的服务器上运行资源密集型计算,因此需要将这些任务交给工作者实例.
这些计算需要运行大量的CPU,并且我希望将延迟保持在尽可能低的水平(希望是秒,而不是几分钟),所以我宁愿在更强大的硬件上运行计算.
我不能以~66¢/ hr x 24小时/天运行强大的EC2实例,因此可能需要按需或点请求实例.
以下是我提出的选项:
每天24小时运行廉价,经济实惠的工作实例,在Amazon SWF(或SQS)管理的时间内执行一项任务.
缺点:
每个任务生成一个更强大的工作者实例(每当作业添加到队列时旋转)并在完成时终止实例.
缺点:
与#2类似,但具有低出价的EC2现场请求.
缺点:
某种混合溶液中,我积极监测仡硬件工人实例及其负载并智能地旋转起来,并终止情况下的时间来维持的成本和可用性的最佳平衡
缺点:
我希望有一些服务,我可以在一分钟到一分钟而不是每小时支付高度可用的按需硬件.
所以我的问题如下:
你会如何推荐解决这个问题?
是否有一个好的EC2实例管理解决方案可以位于Amazon SWF之上并帮助我实现负载平衡并终止闲置工作人员?
现货请求出价是否可以解决我的问题,还是更适合那些不一定需要立即完成的任务?
亚马逊SWF今天推出.如何最好地使用Java/PHP /等?
当前的SDK支持似乎不包含它.我知道它是新的,但有没有人有任何关于如何使用它的好资源,或者我需要在以下任何SDK中实现哪些更改才能立即开始使用?
就个人而言,我对Java和PHP SDK的兴趣是......
更新的版本可在以下网址查看:http: //aws.amazon.com/releasenotes 感谢Bjorn!
我正在寻求有关设计此最佳方式的建议-
用例
我想将多个文件放入 S3。成功保存所有文件后,我想触发一个 lambda 函数来做一些其他工作。
天真的方法
我解决这个问题的方法是在 Dynamo 中保存一条记录,其中包含一个唯一标识符和我将上传的记录总数以及应该存在于 S3 中的密钥。
一个基本的实现是采用我现有的 lambda 函数,该函数在我的 S3 存储桶写入时调用,并让它手动检查是否所有其他文件都已保存。
Lambda 函数会知道(查看 Dynamo 以确定我们要查找的内容)并查询 S3 以查看其他文件是否在其中。如果是,请使用 SNS 触发我的另一个 lambda 来执行其他工作。
编辑:另一种方法是让我将文件放在 S3 中的客户端程序负责直接调用另一个 lambda 函数,因为从技术上讲,它知道所有文件何时上传。这种方法的问题是我不希望这是客户端程序的责任......我希望客户端程序不在乎。一旦它上传了文件,它应该能够退出。
想法
我不认为这是一个好主意。主要是因为 Lambda 函数应该是轻量级的,并且从 Lambda 函数内轮询数据库以获取所有上传文件的 S3 密钥,然后检查 S3 是否存在 - 每次都这样做似乎是贫民窟并且非常重复。
什么是更好的方法?我正在考虑使用 SWF 之类的东西,但不确定这对我的解决方案来说是否太过分了,或者它是否能让我做我想做的事。该文档也没有显示真正的“示例”。这只是一个讨论,没有太多的分步指南(也许我找错了地方)。
编辑回应以下 mbaird 的建议-
选项 1 (SNS)这就是我会去的。这很简单,并没有真正违反单一职责原则。也就是说,客户端上传文件并发送通知(通过 SNS)表明其工作已完成。
选项 2(Dynamo 流)因此,这本质上是选项 1 的另一个“实现”。客户端进行服务调用,在这种情况下,这会导致表更新与 SNS 通知(选项 1)。此更新将触发 Lambda 函数,而不是通知。不错的解决方案,但我更喜欢使用 SNS 进行通信,而不是依赖数据库的功能(在本例中为 Dynamo 流)来调用 Lambda 函数。
在任何情况下,我都在使用 AWS 技术并与他们的产品(Lambda 函数、SNS 等)耦合,但我觉得依赖于 Dynamo 流之类的东西使其耦合更加紧密。对我的用例来说并不是一个很大的问题,但仍然感觉很脏;D …
使用Amazon SWF在服务器之间传递消息?
我正在努力研究如何组合使用Boto和SWF来做到这一点.我不是在完成一些完整的代码之后,但我所追求的是,如果有人能够更多地解释所涉及的内容.
正如你所看到的,我对这一切真的很困惑,如果有人可以对此有所了解,我会非常感激.
我正在寻找比AxonFramework中的Saga更复杂的工作流程 - 我们目前正在使用它 - 我在Netflix Conductor中找到了一个.可悲的是,我在互联网上搜索了一个不错的例子,但无济于事.
我的问题是,在Netflix Conductor中,如何定义和创建Task或WorkflowTask,最重要的是,将微服务链接到它?这是来自github的Netflix指挥代码:
WorkflowDef def = new WorkflowDef();
def.setName("test");
WorkflowTask t0 = new WorkflowTask();
t0.setName("t0");
t0.setType(Type.SIMPLE);
t0.setTaskReferenceName("t0");
WorkflowTask t1 = new WorkflowTask();
t1.setName("t1");
t1.setType(Type.SIMPLE);
t1.setTaskReferenceName("t1");
def.getTasks().add(t0);
def.getTasks().add(t1);
Run Code Online (Sandbox Code Playgroud)
原谅我的困惑,因为我是Netflix Conductor的新手.
亚马逊正在推广boto3用于未来的开发,但没有为新的boto3提供足够的文档.
有没有人有他们愿意分享的使用SWF和boto3的示例代码?
我刚开始使用AWS Ruby SDK来管理简单的工作流程.我立即注意到的一个行为是,在提交新的工作流程执行之前,必须至少运行一个相关工作者和一个相关决策者.
如果我在启动我的工作者和决策者之前提交新的工作流程执行,那么即使我仍处于超时限制范围内,也永远不会接收任务.为什么是这样?根据HTTP长轮询的工作原理,我希望在达到poll()调用时,任一应用程序都会收到相关的任务.
我在工作失败后遇到其他死锁情况(例如由于工人或决策者错误,或由于被终止).有时,重新运行甚至只是开始全新的工作流程执行将导致工作流程执行死锁.初始决策任务显示在AWS控制台的工作流程执行历史记录中,但决策程序从不接收它们.不可否认,我无法确认/减少测试用例的问题,但我怀疑它与上述问题有关.这种情况大约发生在10%到20%的时间; 其余的时间,一切正常.
还有一些需要注意的事情:我正在使用单个任务列表来执行按顺序运行的两个单独的活动任务.工作者和决策者都在轮询相同的任务列表.
这是我的工人:
require 'yaml'
require 'aws'
config_file_path = File.join(File.dirname(File.expand_path(__FILE__)), 'config.yaml')
config = YAML::load_file(config_file_path)
swf = AWS::SimpleWorkflow.new(config)
domain = swf.domains['test-domain']
puts("waiting for an activity")
domain.activity_tasks.poll('hello-tasklist') do |activity_task|
puts activity_task.activity_type.name
activity_task.complete! :result => name
puts("waiting for an activity")
end
编辑
AWS论坛上的另一位用户评论说:
我认为原因是SWF没有立即识别长轮询连接关闭.当您杀死一名工人时,该服务可以认为其连接有一段时间是打开的.所以它仍然可以向它发送任务.对你来说,看起来新工人永远不会得到它.验证它的方法是检查工作流程历史记录.您将看到活动任务已启动事件,其中包含包含死亡工人的主机和pid的标识字段.最终这样的任务将超时并且可以由决策者重试.
请注意,在频繁终止连接的单元测试期间,这种情况很常见,对于任何生产应用程序来说都不是真正的问题.常见的解决方法是为每个单元测试使用不同的任务列表.
这似乎是一个非常合理的解释.我打算试着证实这一点.
我想知道是否有可用于AWS PHPSDK 2+的SWF工作流PHP示例代码?
那里有很多工作流程系统,但我想知道哪一个开源工作流管理系统最接近AWS Flow Framework(与Amazon SWF一样的功能内置)?
amazon-swf ×10
amazon-ec2 ×2
python ×2
amazon-emr ×1
amazon-s3 ×1
aws-lambda ×1
axon ×1
boto ×1
boto3 ×1
cron ×1
lamp ×1
linux ×1
netflix ×1
php ×1
r ×1
workflow ×1