使用java的Amazon sns和sqs消息

 n_light征蓝妙 发布于 2023-01-12 17:19

我有2个不同的系统(A和B),使用amazon sqs进行通信.系统A向系统B发送消息.

目前,系统B使用在服务器启动时启动的独立线程获取消息.这是run方法:

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

            for (Message message : messages) {
             // process messages
            }
        }
    }
}

看看这段代码,我觉得它没有效率,因为它使用繁忙的等待循环.我希望使用某种推送机制来获取消息.

阅读一下有关amazon sqs和sns这似乎可以使用http(服务器B可以为此公开servlet),但我仍然有点困惑.

哪一个(sns或sqs)应该为我提供这种能力(将消息推送到服务器B)?

最简单的方法是什么(对代码的任何引用)?

aj.esler.. 11

在这两者中,只有SNS可用于将消息推送到系统B.SQS可用于对消息进行系统B轮询.

这取决于您的工作负载/应用程序要求,哪个是更好的解决方案.如果您使用SNS,则系统A生成的通知中的大量峰值将导致系统B的工作负载激增,这可能无法处理负载.

如果您正在使用队列,则负载峰值将由Amazon SQS缓冲,并且不会直接影响您的系统B.这有助于将系统B与系统A分离,并在它们之间提供缓冲区.这意味着您可以关闭系统B,进行维护,然后重新启动系统并继续处理消息(例如,假设您的应用程序可以处理延迟的消息处理).

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

另一个考虑因素是消息传递语义.如果邮件无序传递或多次传递,这是否重要?我没有太多使用SNS,所以我不确定它的语义.SQS是一个分布式队列,因此您可能无序接收消息,甚至在某些情况下可能多次接收消息.你的申请可以处理这个问题吗?

SQS支持长轮询,允许您在receiveMessage调用返回之前为消息指定等待时间(最多20秒).这可以限制您对SQS的请求数量,从而降低运行成本.这可能比SNS效率稍低,但在我使用SQS构建的应用程序中,不值得担心.请参阅http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html.

例如,GitHub上提供的AWS Java SDK包括各种AWS服务的使用示例.请参阅https://github.com/aws/aws-sdk-java/blob/master/src/samples/AmazonSimpleQueueService/SimpleQueueServiceSample.java和http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp .example.java.html用于SQS和SNS示例.

您还可以将SNS和SQS结合使用.即,您将消息推送到单个SNS主题,并让SNS将消息的副本推送到多个队列中.请参见http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html

1 个回答
  • 在这两者中,只有SNS可用于将消息推送到系统B.SQS可用于对消息进行系统B轮询.

    这取决于您的工作负载/应用程序要求,哪个是更好的解决方案.如果您使用SNS,则系统A生成的通知中的大量峰值将导致系统B的工作负载激增,这可能无法处理负载.

    如果您正在使用队列,则负载峰值将由Amazon SQS缓冲,并且不会直接影响您的系统B.这有助于将系统B与系统A分离,并在它们之间提供缓冲区.这意味着您可以关闭系统B,进行维护,然后重新启动系统并继续处理消息(例如,假设您的应用程序可以处理延迟的消息处理).

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

    另一个考虑因素是消息传递语义.如果邮件无序传递或多次传递,这是否重要?我没有太多使用SNS,所以我不确定它的语义.SQS是一个分布式队列,因此您可能无序接收消息,甚至在某些情况下可能多次接收消息.你的申请可以处理这个问题吗?

    SQS支持长轮询,允许您在receiveMessage调用返回之前为消息指定等待时间(最多20秒).这可以限制您对SQS的请求数量,从而降低运行成本.这可能比SNS效率稍低,但在我使用SQS构建的应用程序中,不值得担心.请参阅http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html.

    例如,GitHub上提供的AWS Java SDK包括各种AWS服务的使用示例.请参阅https://github.com/aws/aws-sdk-java/blob/master/src/samples/AmazonSimpleQueueService/SimpleQueueServiceSample.java和http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp .example.java.html用于SQS和SNS示例.

    您还可以将SNS和SQS结合使用.即,您将消息推送到单个SNS主题,并让SNS将消息的副本推送到多个队列中.请参见http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html

    2023-01-12 17:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有