标签: amazon-sqs

如何使用Python中的boto库获取Amazon SQS队列中的所有消息?

我正在开发一个应用程序,其工作流程通过使用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中的消息具有可见性超时,这意味着如果我从队列中轮询元素,它们将不会被真正删除,它们只会在短时间内隐形.

是否有一种简单的方法来获取队列中的所有消息,而不知道有多少消息?

python boto amazon-sqs

12
推荐指数
3
解决办法
3万
查看次数

Amazon SQS或任何队列服务的可能用例有哪些?

所以我一直在努力掌握亚马逊,__CODE__因为我公司的整个基础设施都是以它为基础的.

我从未能够正确理解的一个组件是__CODE__,我已经搜索了很多但是我无法得到满意的答案.我认为一份__CODE__工作并且__CODE__有些相似,如果我错了,请纠正我.

到底究竟__CODE__是什么?据我所知,它存储了其他组件__CODE__用于执行任务的简单消息,您可以发送消息来执行此操作.

在这个问题中,有人可以向我解释一下普通网络服务中使用的Amazon Web Services组件是什么吗?; 答案提到他们用来__CODE__排队他们想要异步执行的任务.为什么不直接向用户发送消息并稍后进行处理?为什么要等着__CODE__做呢?

另外,我只想说我有一个网络应用程序,允许用户安排一些日常任务,如何__CODE__适应?

amazon-sqs amazon-web-services

12
推荐指数
3
解决办法
6698
查看次数

您可以在哪里更改触发 AWS Lambda 函数的 SQS 队列的批处理大小?

我可以发誓,有一种简单的方法可以更改配置为 Lambda 触发器的 SQS 队列的批量大小,但截至 2020 年 7 月,我再也找不到发生这种情况的地方。这可能与目前在 AWS 顶部宣传的“新 SQS 控制台体验”有关。

我可以看到队列的当前批次大小(屏幕截图),但该数字不可编辑。我也没有在 SQS 界面中看到与批量大小相关的任何内容。我当前的 IAM 凭证可能无法更改批量大小,并且对我隐藏。有谁知道可以在哪里更改此值?

来自 AWS 的屏幕截图,显示当前批次大小的显示位置

amazon-sqs amazon-web-services aws-lambda

12
推荐指数
2
解决办法
3751
查看次数

SNS主题不发布到SQS

我正在尝试使用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 - 它工作正常.任何想法为什么它不会发送到队列?

amazon-sqs amazon-web-services amazon-sns

11
推荐指数
6
解决办法
8244
查看次数

通过过滤将消息从Amazon SNS路由到SQS

在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中执行此操作.我的第一个想法是在各个队列上设置权限以接受基于主题的消息,但是权限条件的唯一可用字段是:

  • AWS:CURRENTTIME
  • AWS:EpochTime
  • AWS:MultiFactorAuthAge
  • AWS:principaltype
  • AWS:SecureTransport
  • AWS:SourceArn
  • AWS:SOURCEIP
  • AWS:用户代理
  • AWS:用户ID
  • AWS:用户名

这些似乎都不会受到我发布到该message_x主题的任何消息的影响.

当使用Amazon Simple Notification Service扇出到多个简单队列服务队列时,是否可以做这样的事情,每个队列接收发布到该主题的消息子集?

amazon-sqs amazon-web-services amazon-sns

11
推荐指数
2
解决办法
7318
查看次数

Laravel和多个SQS(队列)配置

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)

amazon-sqs laravel laravel-4

11
推荐指数
2
解决办法
4982
查看次数

未触发Amazon Cloudwatch警报

我配置了一个cloudwatch闹钟:

阈值:连续1个周期"大于0",

时间:1分钟,

统计:总和

警报在AWS SQS NumberOfMessagesSent之上配置.队列为空,没有消息发布到它.我手动发了一条消息.我可以看到公制的峰值,但报警状态仍然可以.我有点困惑为什么这个警报没有改变它的状态,即使满足触发它的所有条件.

amazon-sqs amazon-web-services amazon-cloudwatch

11
推荐指数
2
解决办法
2380
查看次数

如何通过PHP将AWS SQS/SNS用作重要处理任务的推送通知队列?

我有一台运行在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 所述的扇出架构.

我对扇出架构示例的问题(据我所知)是这样的:

  1. 将消息发送到SQS或SNS的服务器也将是处理生成元数据任务的同一服务器.事实上,它是相同的网络应用程序.
  2. SQS完成队列部分(因为我想在FIFO中执行任务,并且任务需要很长时间才能完成).但是,它需要我的网络应用程序连续轮询SQS.我想要一个推送通知(从AWS到我的网络应用程序),而不是我的网络应用程序不断轮询AWS以检查要执行的任务.

我在这里找到了可能的解决方案

建议的解决方案是:

  1. 将消息发送到SNS主题.

  2. SNS主题将同时发送SQS队列和我的Web应用程序.

  3. 我的Web应用程序在被触发后将轮询同一个SQS队列,该队列现在已连续排队消息,直到队列为空

我从中看到的缺点是我的Web应用程序将在队列本身有消息之前轮询队列.

使用AWS服务实现推送队列的最佳方法是什么?

php amazon-sqs amazon-web-services amazon-sns

11
推荐指数
1
解决办法
5778
查看次数

模式以持续监听AWS SQS消息

我有一个简单的类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)

java sdk amazon-sqs amazon-web-services

11
推荐指数
1
解决办法
1万
查看次数

Rails,ActiveJobs和AWS SQS:当一个worker实例被杀时,我的工作会发生什么?

我们使用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

11
推荐指数
1
解决办法
370
查看次数