Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么即使我已经提供了URL,活动监视器仍以错误“310:HTML内容URL Required”进行响应?_Ruby On Rails_Ruby On Rails 3_Heroku - Fatal编程技术网

Ruby on rails 为什么即使我已经提供了URL,活动监视器仍以错误“310:HTML内容URL Required”进行响应?

Ruby on rails 为什么即使我已经提供了URL,活动监视器仍以错误“310:HTML内容URL Required”进行响应?,ruby-on-rails,ruby-on-rails-3,heroku,Ruby On Rails,Ruby On Rails 3,Heroku,我正在使用,并且在我的本地开发环境中,我能够成功地创建一个草稿活动 在Heroku上的生产暂存中,返回完全相同的代码,但出现错误: 310: HTML Content URL Required 我正在将HTML内容URL以及所有其他必需的参数传递给Campaign.create。我已经通过记录变量直观地验证了这一事实。下面是API调用: cm_campaign_id = CreateSend::Campaign.create client_id, subject, name, from_nam

我正在使用,并且在我的本地开发环境中,我能够成功地创建一个草稿活动

在Heroku上的生产暂存中,返回完全相同的代码,但出现错误:

310: HTML Content URL Required
我正在将HTML内容URL以及所有其他必需的参数传递给Campaign.create。我已经通过记录变量直观地验证了这一事实。下面是API调用:

cm_campaign_id = CreateSend::Campaign.create client_id, subject, name, from_name, from_email, reply_to, html_url, text_url, list_ids, segment_ids
此外,在本地开发人员中,API调用在不到3秒内返回,而在Heroku上,它超时30秒并返回该错误

为什么会在Heroku发生这种情况?

简短回答:

我在运行一个web dyno时遇到了错误310:HTML内容URL

以下是相关日志:

2012-07-04T19:11:13+00:00 heroku[router]: Error H12 (Request timeout) -> POST my-app-1111.herokuapp.com/campaigns dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
2012-07-04T19:11:13+00:00 app[web.1]: cache: [GET /favicon.ico] miss
2012-07-04T19:11:13+00:00 heroku[router]: GET my-app-1111.herokuapp.com/favicon.ico dyno=web.1 queue=0 wait=0ms service=50ms status=304 bytes=0
2012-07-04T19:11:14+00:00 heroku[router]: Error H12 (Request timeout) -> GET my-app-1111.herokuapp.com/newsletters/1?cm=1 dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
2012-07-04T19:11:14+00:00 app[web.1]: [error] CampaignMonitor error: The CreateSend API responded with the following error - 310: HTML Content URL Required
看到GET-my-app-1111.herokuapp.com/newsletters/1?cm=1上的请求超时错误,我想起Campaign Monitor立即为所有新闻稿资产回调我的应用程序

当我将web动态对象的数量增加到两个时,有时错误会更改为312:文本内容URL Required,在获取my-app-1111.herokuapp.com/newsletters/1.txt时会超时;其他时候,仍然有两个dyno,API不会出错,因为活动草稿是实际创建的,但应用程序在其他资产上超时,并且该站点仍然产生股票应用程序错误。以下是一些资产超时:

2012-07-04T19:20:21+00:00 heroku[router]: Error H12 (Request timeout) -> POST my-app-1111.herokuapp.com/campaigns dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
2012-07-04T19:20:24+00:00 heroku[router]: Error H12 (Request timeout) -> GET my-app-1111.herokuapp.com/assets/video/play.png dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
2012-07-04T19:20:24+00:00 heroku[router]: Error H12 (Request timeout) -> GET my-app-1111.herokuapp.com/assets/video/pause.png dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
当我将web动态对象的数量增加到三个时,仍然存在资产超时

使用四个web dynos,整个过程有时会成功完成,也就是说,不一定不管怎么说,即使它总是成功的,仅仅创建“运动监视器”时事通讯的四个Dyno也太贵了

CDN上的资产

多亏了和fog,我已经将我的应用程序转换为AmazonS3,我又回到了这个问题:使用Heroku的活动监视器

由于我的应用程序不再提供资产服务,它们由AmazonS3提供服务,因此它所负责的基本上就是返回HTML

在CampaignMonitor方面,当您查询他们的API以根据您的新闻稿创建活动时,他们会立即给您回电话下载您的新闻稿。这实际上意味着他们发送了两个并行请求:一个是HTML版本的新闻稿,另一个是文本版本的新闻稿。如果一个dyno被最初对其API的调用阻止,并且所有资产都托管在CDN上,那么您可能会认为第二个dyno就可以做到这一点。事实上,我已经看到一秒钟的dyno处理了对HTML和文本版新闻稿的并行请求。但它不可靠,因为仍然存在随机超时错误H12请求超时:

Heroku的支持表示,这是因为他们独立地发送每个请求,期望最终接收dyno能够处理它。这里发生的是,在某些情况下,发出post的同一个dyno就是接收第二个请求的dyno,但是它似乎需要第二个请求的结果来完成post请求,所以它会死锁

解决方案

一个可能的临时解决方案是将unicorn用于您的应用程序服务器,带有两个unicorn worker_进程。这样,即使Heroku向忙碌的dyno发送消息,第二个独角兽侦听器也会响应请求


但最终,除了将unicorn与两个worker_进程一起使用外,正确的解决方案是通过延迟_作业之类的方式异步处理请求,并使用workless根据需要启动Heroku worker dynos,所以你只为你使用的东西付费。

,因为他们的API要求你的应用程序第二个请求发生在第一个正在进行的请求的中间,我建议你把逻辑移到一个工作者进程:

向应用程序发出的创建活动的请求不会与活动监视器通信,而是在表中创建一个作业,并重定向到检查该作业状态的页面 worker dyno看到作业并开始处理它,发布到Campaign Monitor API…因为这不是web dyno,等待也不是问题 然后,CM API将请求新闻稿页面并回复worker dyno 然后,worker dyno可以更新作业的状态 一直以来,您在第一步中重定向到的页面可以继续刷新自己,轮询作业的状态,并在它注意到作业已完成后显示最终页面。
您好,就像您提到的,活动监视器将立即下载并解析您的活动的HTML和文本内容。在解析HTML内容时,我们将下载所有链接资产,根据当时的负载情况,这些资产具有一定程度的并行性,这就是为什么您仍然看到只有2或3个dyno的超时。很明显,这只是当前的实现,可能会发生变化,但可以说,我们将始终尝试并行下载您的资产。@Toby我已经更新了我的答案,说t hat在CDN上托管资产的Heroku应用程序至少需要3个web Dyno才能使用活动监视器。这一事实可能会出现在您的文档顶部的某个位置,因为它意味着大量的费用。
2012-08-16T23:00:42+00:00 heroku[router]: Error H12 (Request timeout) -> POST my-app-1111.herokuapp.com/campaigns dyno=web.2 queue= wait= service=30000ms status=503 bytes=0
2012-08-16T23:00:42+00:00 heroku[router]: GET my-app-1111.herokuapp.com/favicon.ico dyno=web.4 queue=0 wait=0ms service=7ms status=304 bytes=0
2012-08-16T23:00:42+00:00 heroku[router]: Error H12 (Request timeout) -> GET my-app-1111.herokuapp.com/newsletters/1?cm=1 dyno=web.2 queue= wait= service=30000ms status=503 bytes=0
2012-08-16T23:00:43+00:00 app[web.2]: [error] CampaignMonitor error: The CreateSend API responded with the following error - 310: HTML Content URL Required