我试图触发lambda执行来执行FIFO队列上的项目.除了民意调查,我们还有什么方法可以实现这一目标?我们刚刚了解到,我们无法直接从FIFO队列触发lambda执行,而FIFO队列目前仅支持标准队列.我还了解到我们不能将SNS主题订阅到FIFO队列 - 这也仅在标准队列上受支持.
在亚马逊发布更新之前,有没有人为此找到解决方法?
我们有一堆SQS工作,我们使用Laravel来监视和处理php artisan queue:listen.
定期,有几分钟的短暂和SQS超时.发生这种情况时,请queue:listen使用以下消息中止:
[Symfony\Component\Process\Exception\ProcessTimedOutException]
The process "php artisan queue:work
--queue="https://sqs.us-west-2.amazonaws.com/*******/queue"
--delay=0 --memory=128 --sleep=3 --tries=0 -env=production"
exceeded the timeout of 60 seconds.
Run Code Online (Sandbox Code Playgroud)
我已经尝试过处理异常app/start/global.php,或者app/start/artisan.php:
App::error(function(Symfony\Component\Process\Exception\ProcessTimedOutException $exception) {
// do nothing
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,异常仍然发生,我queue:listen仍然死了.
如何捕获此异常并忽略它以进行重试?
我试图让spring cloud与使用自动配置的消息一起工作.
我的属性文件包含:
cloud.aws.credentials.accessKey=xxxxxxxxxx
cloud.aws.credentials.secretKey=xxxxxxxxxx
cloud.aws.region.static=us-west-2
Run Code Online (Sandbox Code Playgroud)
我的Configuration类如下:
@EnableSqs
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的听众课程:
@RestController公共类OrderListener {
@RestController
public class OrderListener {
@MessageMapping("orderQueue")
public void orderListener(Order order){
System.out.println("Order Name " + order.getName());
System.out.println("Order Url" + order.getUrl());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个.我收到以下错误:
org.springframework.context.ApplicationContextException: Failed to start bean 'simpleMessageListenerContainer'; nested exception is org.springframework.messaging.core.DestinationResolutionException: The specified queue does not exist for this wsdl version. (Service: AmazonSQS; Status Code: 400; Error Code: AWS.SimpleQueueService.NonExistentQueue; Request …Run Code Online (Sandbox Code Playgroud) spring annotations amazon-sqs amazon-web-services spring-cloud
我有一个带有 SQS 触发器的 Lambda。当它被击中时,来自 SQS 的一批记录进来(我认为通常一次大约 10 个)。如果我从处理程序返回失败的状态代码,将重试所有 10 条消息。如果我返回成功代码,它们都会从队列中删除。如果这 10 条消息中有 1 条失败,而我只想重试那一条怎么办?
exports.handler = async (event) => {
for(const e of event.Records){
try {
let body = JSON.parse(e.body);
// do things
}
catch(e){
// one message failed, i want it to be retried
}
}
// returning this causes ALL messages in
// this batch to be removed from the queue
return {
statusCode: 200,
body: 'Finished.'
};
};
Run Code Online (Sandbox Code Playgroud)
我是否必须手动将该消息重新添加回队列?或者我可以从我的处理程序返回一个状态,指示一条消息失败并应该重试?
我正在尝试在我正在处理的项目中使用 Spring Cloud 的 AWS SQS。目前,我仅在我的开发机器上本地运行该应用程序。因此,我想要的是连接到 AWS 上的 SQS,而不必将我的应用程序部署到 EC2 实例。
但是,似乎 Spring Cloud 的 AWS 包中使用的 AWS SDK 将尝试通过元数据进行身份验证并希望解析 169.254.169.254/latest/meta-data/instance-id. 由于我仍在本地运行应用程序,因此无法解析端点并引发错误:
2019-12-29 16:38:27.420 WARN 22462 --- [ restartedMain] com.amazonaws.util.EC2MetadataUtils : Unable to retrieve the requested metadata (/latest/meta-data/instance-id). Failed to connect to service endpoint:
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100) ~[aws-java-sdk-core-1.11.699.jar:na]
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70) ~[aws-java-sdk-core-1.11.699.jar:na]
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75) ~[aws-java-sdk-core-1.11.699.jar:na]
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:62) ~[aws-java-sdk-core-1.11.699.jar:na]
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:400) ~[aws-java-sdk-core-1.11.699.jar:na]
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:369) ~[aws-java-sdk-core-1.11.699.jar:na]
at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38) ~[spring-cloud-aws-context-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.aws.context.annotation.OnAwsCloudEnvironmentCondition.matches(OnAwsCloudEnvironmentCondition.java:37) ~[spring-cloud-aws-context-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at …Run Code Online (Sandbox Code Playgroud) java amazon-sqs amazon-web-services spring-boot spring-cloud
我正在努力想出在AWS中扩展聊天服务的最佳解决方案.我想出了几个潜在的解决方案:
Redis Pub/Sub - 当用户与服务器建立连接时,服务器订阅该用户的ID.当有人向该用户发送消息时,服务器将使用用户的id对该频道执行发布.用户连接的服务器将接收消息并将其下推到相应的客户端.
SQS - 我想过为每个用户创建一个队列.用户连接的服务器将轮询(或使用SQS长轮询)该队列.发现新消息时,它将从服务器推送给用户.
SNS - 我真的很喜欢这个解决方案,直到我发现100个主题限制.我需要为每个用户创建一个主题,该主题仅支持100个用户.
他们可以使用AWS扩展聊天的其他方式吗?SQS方法是否可行?AWS向队列添加消息需要多长时间?
来自https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-queueconfig
将队列可见性超时设置为函数超时的 6 倍,加上以下值
MaximumBatchingWindowInSeconds
为什么队列可见性超时不能等于函数超时?假设该函数的超时时间为 30 秒,队列可见性也是如此。该函数拾取消息并经过 30 秒,该消息尚未删除,现在对其他函数/消费者可见。那为什么一定要6次呢?最大批处理窗口在队列可见性超时中扮演什么角色?
在开发过程中,我在Amazon SQS上生成了大量虚假消息.我正准备编写一个小应用程序来删除所有消息(我在开发过程中经常这样做).有谁知道清除队列的工具?
我知道SQS不是为此而构建的,但我很好奇是否可以在符合某些条件的队列中查找消息?
我可以在循环中提取消息,在消息体中搜索某些模式(甚至不反序列化它们),并过滤我需要的消息.但是有可能最终得到一个无限循环 - 我读到的第一个消息将在我到达队列末尾时返回队列...
扩展消息的可见性,但我如何确切地知道扫描整个队列需要多长时间,以及我应该延长可见性多长时间?如果我在那里有一万条消息怎么办?
这里有解决方法吗?我需要扫描队列中的某些消息,然后删除那些消息......
amazon-sqs ×10
aws-lambda ×3
spring-cloud ×2
annotations ×1
java ×1
laravel ×1
laravel-4 ×1
node.js ×1
php ×1
real-time ×1
redis ×1
scalability ×1
spring ×1
spring-boot ×1