当前位置: 首页 > 知识库问答 >
问题:

为什么亚马逊sqs不支持交易?

支铭晨
2023-03-14

对不起.我又加了一些内容。我在Spring中测试了两个消息队列(rabbitmq、amazon sqs),如下所示。

我的目的是逻辑处理用户电子邮件到队列发送注册完成电子邮件时,用户完成注册无一例外。

//rabbit mq configuration.class
@Bean
public ConnectionFactory rabbitConnectionFactory() {
    CachingConnectionFactory connectionFactory =
            new CachingConnectionFactory("localhost",5672);
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
    return connectionFactory;
}

@Bean
public SimpleMessageListenerContainer messageListenerContainer() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(rabbitConnectionFactory());
    container.setQueueNames(queue);
   container.setMessageListener(exampleListener());
    container.setTransactionManager(platformTransactionManager);
    container.setChannelTransacted(true);
    return container;
}


@Bean
public RabbitTemplate producerRabbitTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(rabbitConnectionFactory());
    rabbitTemplate.setQueue(queue);
    rabbitTemplate.setMandatory(true);
    rabbitTemplate.isChannelTransacted();
    rabbitTemplate.setChannelTransacted(true);
    return rabbitTemplate;
}



//UserService.class
@Autowired
private final UserRepository userRepository;
@Autowired
private final RabbitTemplate rabbitTemplate;

@Transactional
public User createUser(final User user){
    rabbitTemplate.convertAndSend("spring-boot", user.getEmail()); // SignUp Completion email
    final User user = userRepository.save(user);
    if(true) throw new RuntimeException();
    return user;
}

但是,上面的逻辑发生RuntimeException。

//amazon sqs configuration.class
@Bean
public QueueMessagingTemplate queueMessagingTemplate(AmazonSQSAsync amazonSqs) {

//UserService.class
@Autowired
private final UserRepository userRepository;
@Autowired
private QueueMessagingTemplate messagingTemplate;


@Transactional
public User createUser(final User user){
    messagingTemplate.convertAndSend("spring-boot", user.getEmail()); // SignUp Completion email
    final User user = userRepository.save(user);
    if(true) throw new RuntimeException();
    return user;
}

有人知道这是为什么吗?

共有1个答案

孟新知
2023-03-14

我如何解决这个问题?

不要试图为此使用事务,想出一些方法来使系统最终保持一致。

听起来像是要像执行事务一样执行'Queue.SendMessage'和'Repository.Save'-要么都提交,要么都不提交。问题是“transaction”实际上并不是事务性的,即使在rabbit示例中也是如此。

    null
@Transactional
public User createUser(final User user){
    messagingTemplate.convertAndSend("spring-boot", user.getEmail());
    final User user = userRepository.save(user);
    return user;
}
  • 当为此启动提交步骤时,它需要使消息(在队列中)和用户(在回购中)都可见
  • 为此,需要对队列和repo进行网络调用
    • 这是两个调用这一事实是问题的根源
    • 您可能会说“事务可以回滚”--但回滚将涉及另一个网络调用,这当然会失败。

    有一些方法可以使整个分布式系统事务化,但这是一个非常复杂的问题。允许暂时的不一致性,并建立机制使系统最终保持一致,通常会容易得多,速度也快得多。

 类似资料:
  • 我刚刚开始使用AWS EC2。我明白EC2就像一台远程计算机,在那里我可以做几乎所有我想做的事情。然后我发现了ECS的事。我知道它使用Docker,但我对这两者之间的关系感到困惑。 ECS只是EC2中的Docker安装吗?如果我已经有一个EC2并且我启动了一个ECS,这是否意味着我有两个实例?

  • 我有一个用例,其中将有数据流到来,而我不能以相同的速度消耗它,并且需要一个缓冲区。这可以使用SNS-SQS队列来解决。我知道Kinesis解决了同样的目的,那么有什么区别呢?为什么我应该喜欢(或者不应该喜欢)Kinesis?

  • 我正在为web集成amazon pay SDK python。 我已经阅读了亚马逊支付的所有留档,但是我不知道如何在前端/后端代码中给出或创建按钮签名。这是我的前端代码,用于创建亚马逊支付一次性结账按钮。 如果有人实现了这一点,请给出您有价值的答案...

  • 亚马逊云 图 1.20.2.1 - AWS AWS,即 Amazon Web Services,是亚马逊(Amazon)公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务,使用户几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT

  • 亚马逊SNS支持windows桌面的通知吗? 我是推送通知服务的新手。我想在我的项目中启用推送通知。我在搜索并了解到亚马逊社交网站可以向Windows Mobile和iOS mobiles发送推送通知。但我也想在我的web应用程序中启用通知功能。

  • 下面是我的php实现代码: 这是用于生成Amazon Pay按钮的JS实现代码。