亚马逊sns&;使用java的sqs消息

亚马逊sns&;使用java的sqs消息,java,amazon-sqs,amazon-sns,Java,Amazon Sqs,Amazon Sns,我有两个不同的系统(A和B),它们使用。 系统A向系统B发送消息 目前,系统B使用一个单独的线程获取消息,该线程在服务器启动时启动。 以下是运行方法: @Override public void run() { while (true) { ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); try { receiv

我有两个不同的系统(A和B),它们使用。 系统A向系统B发送消息

目前,系统B使用一个单独的线程获取消息,该线程在服务器启动时启动。 以下是运行方法:

@Override
public void run() {
    while (true) {
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
        try {
            receiveMessageRequest.setWaitTimeSeconds(1);
            List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();

            for (Message message : messages) {
             // process messages
            }
        }
    }
}
@覆盖
公开募捐{
while(true){
ReceiveMessageRequest ReceiveMessageRequest=新的ReceiveMessageRequest(myQueueUrl);
试一试{
receiveMessageRequest.setWaitTimeSeconds(1);
List messages=sqs.receiveMessage(receiveMessageRequest.getMessages();
用于(消息:消息){
//处理消息
}
}
}
}
看着这段代码,我觉得它效率不高,因为它使用了一个繁忙的等待循环。 我希望使用某种推送机制来获取消息

阅读一些关于amazon的文章,这似乎可以使用http(服务器B可以为此公开servlet)实现,但我还是有点困惑

  • 哪一个(sns或sqs)应该为我提供这种能力(将消息推送到服务器B)
  • 最简单的方法是什么(引用代码)

其中,只有SNS可用于将消息推送到系统B。SQS可用于对消息进行系统B轮询

这取决于您的工作负载/应用程序需求,哪种解决方案更好。如果您使用SNS,那么系统a生成的通知的大峰值将导致系统B的工作负载峰值,这可能无法处理负载

如果使用队列,负载峰值将由Amazon SQS缓冲,不会直接影响系统B。这有助于将系统B与系统a分离,并在它们之间提供缓冲区。这意味着您可以关闭系统B,进行维护,然后使系统恢复运行并继续处理消息,就像什么都没有发生一样(假设您的应用程序可以处理延迟的消息处理)

我在队列中看到的另一个主要优点是,它使扩展应用程序变得更简单,因为您可以启动运行使用者的新实例,现在您可以以更高的速率处理消息(假设系统中没有其他瓶颈)

另一个考虑事项是消息传递语义。邮件是否按顺序发送或多次发送是否重要?我很少使用SNS,所以我不确定它的语义。SQS是一个分布式队列,因此您可能会无序接收消息,在某些情况下甚至多次接收消息。您的应用程序可以处理这个问题吗

SQS支持长轮询,允许您在receiveMessage调用返回之前为消息指定等待时间(最多20秒)。这可以限制您向SQS发出的请求数量,从而降低运行成本。这可能比SNS的效率稍低,但在我使用SQS构建的应用程序中,不值得担心。 看

例如,GitHub上提供的AWS Java SDK包括各种AWS服务的使用示例。有关SQS和SNS示例,请参见和


您还可以结合SNS和SQS。即将消息推送到单个SNS主题,并让SNS将消息副本推送到多个队列中。请看

谢谢,这肯定会给你一些启示。根据你的回答,我还有两个问题。1) 当使用长轮询时,在等待时间内,我的线程是进入“等待”状态还是阻塞?2) 似乎一个合适的解决方案是同时使用sns和sqs,其中sns将消息传递到某个队列,然后通知系统b队列中正在等待新消息。这有意义吗?我想它会使用wait/notify或其他异步方法来等待。将包含答案。取决于您的应用程序,哪种是正确的使用SNS和SQS的方法,但您所描述的方法会起作用。尽管您可以直接轮询并避免使用通知组件。如果是非常不频繁的消息,通知然后请求消息可能更好。即使是非常不频繁的消息,20秒的轮询时间,我们谈论的是非常少量的CPU、网络和AWS API调用成本。