我正在开发一个应用程序,其工作流程通过使用boto在SQS中传递消息来管理.
我的SQS队列逐渐增长,我无法检查它应该包含多少元素.
现在我有一个守护进程定期轮询队列,并检查我是否有一组固定大小的元素.例如,考虑以下"队列":
q = ["msg1_comp1", "msg2_comp1", "msg1_comp2", "msg3_comp1", "msg2_comp2"]
Run Code Online (Sandbox Code Playgroud)
现在我要检查,如果我在队列一起在某个时间点"msg1_comp1","msg2_comp1"和"msg3_comp1",但我不知道队列的大小.
查看API后,您似乎只能获得1个元素或队列中固定数量的元素,但不是全部:
>>> rs = q.get_messages()
>>> len(rs)
1
>>> rs = q.get_messages(10)
>>> len(rs)
10
Run Code Online (Sandbox Code Playgroud)
答案中提出的建议是在循环中获取10个消息,直到我什么也得不回来,但SQS中的消息具有可见性超时,这意味着如果我从队列中轮询元素,它们将不会被真正删除,它们只会在短时间内隐形.
是否有一种简单的方法来获取队列中的所有消息,而不知道有多少消息?
所以我一直在努力掌握亚马逊,__CODE__因为我公司的整个基础设施都是以它为基础的.
我从未能够正确理解的一个组件是__CODE__,我已经搜索了很多但是我无法得到满意的答案.我认为一份__CODE__工作并且__CODE__有些相似,如果我错了,请纠正我.
到底究竟__CODE__是什么?据我所知,它存储了其他组件__CODE__用于执行任务的简单消息,您可以发送消息来执行此操作.
在这个问题中,有人可以向我解释一下普通网络服务中使用的Amazon Web Services组件是什么吗?; 答案提到他们用来__CODE__排队他们想要异步执行的任务.为什么不直接向用户发送消息并稍后进行处理?为什么要等着__CODE__做呢?
另外,我只想说我有一个网络应用程序,允许用户安排一些日常任务,如何__CODE__适应?
我可以发誓,有一种简单的方法可以更改配置为 Lambda 触发器的 SQS 队列的批量大小,但截至 2020 年 7 月,我再也找不到发生这种情况的地方。这可能与目前在 AWS 顶部宣传的“新 SQS 控制台体验”有关。
我可以看到队列的当前批次大小(屏幕截图),但该数字不可编辑。我也没有在 SQS 界面中看到与批量大小相关的任何内容。我当前的 IAM 凭证可能无法更改批量大小,并且对我隐藏。有谁知道可以在哪里更改此值?
我正在尝试使用SNS和SQS对分布式应用程序进行原型设计.我有这个主题:
arn:aws:sns:us-east-1:574008783416:us-east-1-live-auction
和这个队列:
arn:aws:sqs:us-east-1:574008783416:queue4
我使用JS Scratchpad创建了队列.我使用控制台添加了订阅.我使用暂存器将AddPermission添加到队列中.队列策略现在是:
{
"Version":"2008-10-17",
"Id":"arn:aws:sqs:us-east-1:574008783416:queue4/SQSDefaultPolicy",
"Statement":[
{
"Sid":"RootPerms",
"Effect":"Allow",
"Principal":{
"AWS":"574008783416"
},
"Action":"SQS:*",
"Resource":"arn:aws:sqs:us-east-1:574008783416:queue4"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我有一个关于同一主题的电子邮件订阅,电子邮件很好地到达,但邮件从未到达队列.我已经尝试使用Scratchpad将SendMessage直接发送到队列 - 而不是通过SNS - 它工作正常.任何想法为什么它不会发送到队列?
在RabbitMQ中,可以创建一个交换,然后将其绑定到多个队列,每个队列都有一个路由密钥.这使得消息传递体系结构如下所示:
message_x
/ | \
foo-msg_q bar-msg_q msg-logger_q
Run Code Online (Sandbox Code Playgroud)
客户端将消息发布到message_x交换机,该消息仅将具有路由密钥"foo"的消息路由到foo-msg_q队列,仅将具有路由密钥"bar"的消息路由到bar-msg_q队列,并将所有消息路由到msg-logger_q队列.
我无法确定如何在AWS中执行此操作.我的第一个想法是在各个队列上设置权限以接受基于主题的消息,但是权限条件的唯一可用字段是:
这些似乎都不会受到我发布到该message_x主题的任何消息的影响.
当使用Amazon Simple Notification Service扇出到多个简单队列服务队列时,是否可以做这样的事情,每个队列接收发布到该主题的消息子集?
Queue类上是否有一个方法可以指定队列配置中定义的特定连接?MySql有一个类似的选项,你可以在其中定义'mysql2',然后调用:
DB::connection('mysql2')->table('etc')->get();
Run Code Online (Sandbox Code Playgroud)
队列有类似的选择吗?
就像是:
Queue::connection('sqs2')->push('MyQueue', array('message' => $message));
Run Code Online (Sandbox Code Playgroud) 我配置了一个cloudwatch闹钟:
阈值:连续1个周期"大于0",
时间:1分钟,
统计:总和
警报在AWS SQS NumberOfMessagesSent之上配置.队列为空,没有消息发布到它.我手动发了一条消息.我可以看到公制的峰值,但报警状态仍然可以.我有点困惑为什么这个警报没有改变它的状态,即使满足触发它的所有条件.
我有一台运行在rackspace上的服务器,它托管一个PHP Web应用程序.
PHP Web应用程序将接受表单提交,然后需要根据表单字段条目执行任务.
任务(让我们称之为生成元数据任务)需要相当多的处理时间.我想知道如何允许表单提交直接保存到数据库,并在后台运行生成元数据任务时立即向用户显示成功页面.
我已将"aws/aws-sdk-php": "~3.11"使用composer 安装到同一个Web应用程序中.
我的计划最初是这样的:
处理表单提交的代码
$result = $model->save($_POST);
// this code will send the information to either SQS or SNS
$awsClient->sendsMessage($_POST);
if ($result) {
$this->redirect('success.html');
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了AWS 所述的扇出架构.
我对扇出架构示例的问题(据我所知)是这样的:
我在这里找到了可能的解决方案
建议的解决方案是:
将消息发送到SNS主题.
SNS主题将同时发送SQS队列和我的Web应用程序.
我的Web应用程序在被触发后将轮询同一个SQS队列,该队列现在已连续排队消息,直到队列为空
我从中看到的缺点是我的Web应用程序将在队列本身有消息之前轮询队列.
使用AWS服务实现推送队列的最佳方法是什么?
我有一个简单的类QueueService,其中包含一些方法,这些方法包含来自AWS SQS SDK for Java的方法.例如:
public ArrayList<Hashtable<String, String>> receiveMessages(String queueURL) {
List<Message> messages = this.sqsClient.receiveMessage(queueURL).getMessages();
ArrayList<Hashtable<String, String>> resultList = new ArrayList<Hashtable<String, String>>();
for(Message message : messages) {
Hashtable<String, String> resultItem = new Hashtable<String, String>();
resultItem.put("MessageId", message.getMessageId());
resultItem.put("ReceiptHandle", message.getReceiptHandle());
resultItem.put("Body", message.getBody());
resultList.add(resultItem);
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
我有另一个名为Appa的类,main并创建了一个实例QueueService.
我正在寻找一个"模式"来使mainin App中侦听队列中的新消息.现在我有一个while(true)循环,我调用该receiveMessages方法:
while(true) {
messages = queueService.receiveMessages(queueURL);
for(Hashtable<String, String> message: messages) {
String receiptHandle = message.get("ReceiptHandle");
String messageBody = …Run Code Online (Sandbox Code Playgroud) 我们使用Rails 5.0.2和ActiveJobs在AWS魔豆与SQS与宝石后端active_elastic_job.
我们的工作定义如下:
class MyJob < ActiveJob::Base
rescue_from(StandardError) do |exception|
self.class.set(:wait => 1.minutes).perform_later
end
def perform
MyLongTask.run
end
end
Run Code Online (Sandbox Code Playgroud)
我们经历过,当工作环境中的一个实例被杀死(由于自动缩放或某种原因)时,rescue_from不会执行该操作,并且不会将作业发送回队列.
我们怎样才能捕获实例被调用被杀的那一刻,这样我们才能在我的进程真正被杀之前优雅地做出反应和包裹?(如果可能的话)
我正在尝试这个
class MyJob < ActiveJob::Base
def perform
begin
sleep(100)
rescue SignalException => e
# send signal to some log place
raise e
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,当我终止实例时,日志永远不会发送,因为我没有杀死美洲狮进程$ restart puma
ruby-on-rails amazon-sqs amazon-web-services amazon-elastic-beanstalk rails-activejob
amazon-sqs ×10
amazon-sns ×3
aws-lambda ×1
boto ×1
java ×1
laravel ×1
laravel-4 ×1
php ×1
python ×1
sdk ×1