小编Jer*_*orn的帖子

为什么SqS消息有时会在队列中保持在飞行状态

我以非常简单的方式使用Amazon SQS队列.通常,消息被写入并立即可见和读取.有时,会写入一条消息,并在队列中保持几分钟的飞行中(不可见).我可以从控制台看到它.接收消息等待时间为0,默认可见性为5秒.它将保持这种状态几分钟,或者直到新消息被写入以某种方式释放它.几秒钟的延迟是可以的,但超过60秒是不行的.

有8个读取器线程总是很长的轮询,所以它不是没有尝试读取它的东西,它们是.

编辑:要清楚,消费者读取都没有返回任何消息,无论控制台是否打开,它都会发生.在这种情况下,只涉及一条消息,它只是位于消费者看不到的队列中.

有没有其他人看到这种行为,我可以做些什么来改善它?

这是我正在使用的java的sdk:

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.5.2</version>
</dependency>     
Run Code Online (Sandbox Code Playgroud)

这是执行读取的代码(max = 10,maxwait = 0启动配置):

void read(MessageConsumer consumer) {

  List<Message> messages = read(max, maxWait);

  for (Message message : messages) {
    if (tryConsume(consumer, message)) {
      delete(message.getReceiptHandle());
    }
  }
}

private List<Message> read(int max, int maxWait) {

  AmazonSQS sqs = getClient();
  ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
  rq.setMaxNumberOfMessages(max);
  rq.setWaitTimeSeconds(maxWait);
  List<Message> messages = sqs.receiveMessage(rq).getMessages();

  if (messages.size() > 0) {
    LOG.info("read {} messages from SQS queue",messages.size());
  }

  return messages;
}
Run Code Online (Sandbox Code Playgroud)

当发生这种情况时,"read .."的日志行永远不会出现,它是什么原因导致我进入控制台并查看消息是否存在,它是.

amazon-sqs amazon-web-services

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

使用Google身份验证令牌导致"令牌受众群体不正确"的原因

我正在创建一个简单的Web应用程序,它将使用Google身份验证返回OpenID令牌,然后使用javascript WebIdentityCredentials将该令牌传递给AWS.

我做了什么:

  1. 创建了Google项目,并保存了OAuth ClientID
  2. 使用Google IDP创建IAM角色,并将OAuth ClientID创建为Audience字段.
  3. 在上面配置的网页中包含Google API和AWS API javascript.
  4. (客户端)使用google js api从Google请求id令牌
  5. 在WebIdentityCredentials上配置id令牌
  6. 检索AWS凭据(使用该令牌)

检索凭据时,我从STS收到此错误:

<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <Error>
    <Type>Sender</Type>
    <Code>InvalidIdentityToken</Code>
    <Message>Incorrect token audience</Message>
  </Error>
  <RequestId>28d09368-bf98-11e5-b52f-953b4c773ebf</RequestId>
</ErrorResponse>
Run Code Online (Sandbox Code Playgroud)

以下是AWS角色:

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Principal": {"Federated": "accounts.google.com"},
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "accounts.google.com:aud": "<my-oauth-client-id>"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

以下是我用于在AWS上下文中配置令牌的代码:

AWS.config.update({
   region: 'us-east-1',
   credentials: new AWS.WebIdentityCredentials({
     RoleArn: 'arn:aws:iam::<my-acct>:role/lab-amp-google-idp',
     WebIdentityToken : token
   })
});
Run Code Online (Sandbox Code Playgroud)

这里是我通过获取凭据测试凭据的地方:

AWS.config.credentials.get(function(err) {
   if (err) console.log(err);
   else console.log(AWS.config.credentials);
});
Run Code Online (Sandbox Code Playgroud)

我已经使用jwt.io验证了id令牌,我可以看到它具有正确的预期字段."aud"和"azp"属性具有OAuth客户端ID.我还仔细检查了AWS角色中的Trust stansza,以确认它在条件中也具有完全相同的OAuth客户端ID.

我已经传入了其他无效的令牌并改变了RoleArn只是为了看到不同的错误,我这样做.

我在网上找不到任何描述"不正确的令牌受众"原因的内容,所以我不知道接下来要尝试什么.

authentication amazon-web-services google-openid oauth-2.0 google-plus

7
推荐指数
0
解决办法
1048
查看次数

Chrome 网络视图中的“已完成”状态意味着什么

我们有一个使用 ExtJs 作为前端的应用程序,并进行许多 ajax 调用,其中大部分是 RESTful JSON。在极少数情况下,我们会看到正常的常见请求之一未返回数据。在 Chrome 开发控制台的网络视图中,请求的状态显示为已完成,大小为 0 字节。它看起来与我们看到的本地缓存命中(即“来自缓存”的 200)不同。根据wireshark,实际上没有进行任何网络调用。我在网上找不到太多描述这种状态的信息。

完成状态是什么意思以及通常的原因是什么?

ajax rest google-chrome http

5
推荐指数
0
解决办法
709
查看次数

如何拦截WCF中的反序列化后请求对象

我需要拦截所有Web服务的WCF请求.所有服务都遵循严格的模型,其中操作必须从我们的基本请求类型扩展单个请求.该基本请求类型包含我们需要各种系统级支持的属性,自定义日志记录是一个,但还有许多其他.我希望使用IDispatchMessageInspector,但我不知道如何从"消息"中获取请求对象,而无需从正文中重新创建副本.我需要这个是高效的,所以每个请求创建两个副本不会削减它.

我知道我可以使用System.Reflection.Emit创建代理,但是这将与服务激活和工厂混淆......我希望有更容易获得的东西,比如CXF拦截器为Java工作的方式.

无论如何我可以在调度到服务impl之前拦截服务器中的实际单个请求实例吗?

wcf request interceptor

3
推荐指数
1
解决办法
851
查看次数