1

我正在尝试实现一个简单的分布式应用程序,并且我想将所有事件保存到事件存储中。出于这个原因,正如 Axon here的“文档”中所建议的那样,我想使用 Mysql 作为事件存储。

由于我对 Spring 没有太多经验,因此我无法理解如何使其工作。我将有两个单独的服务,一个用于命令端,一个用于查询端。由于我计划提供更多服务,因此我想知道如何将它们配置为使用外部事件存储(不存储在任何这些服务中)。

对于命令和事件的分发,我使用的是 RabbitMQ:

@Bean
public org.springframework.amqp.core.Exchange exchange() {
    return ExchangeBuilder.fanoutExchange("AxonEvents").build();
}

@Bean
public Queue queue() {
    return QueueBuilder.durable("AxonEvents").build();
}

@Bean
public Binding binding() {
    return BindingBuilder.bind(queue()).to(exchange()).with("*").noargs();
}


@Autowired
public void configure(AmqpAdmin admin)
{
    admin.declareExchange(exchange());
    admin.declareQueue(queue());
    admin.declareBinding(binding());
}

这会在本地运行的 RabbitMQ 实例上创建所需的队列(使用默认用户名和密码)。

我的问题是:如何配置 Axon 以使用 mysql 作为事件存储?

4

1 回答 1

1

由于参考指南目前没有具体说明这一点,我将在这里指出这一点。目前,在分发 Axon 应用程序或将 Axon 应用程序分离为(微)服务时,您大致有两种方法:

  1. 使用完全开源的方法
  2. 使用AxonHub / AxonDb

采用方法 2,您可以在开发人员环境中执行该方法,您只需运行 AxonHub 和 AxonDb 并将它们配置到您的应用程序。就是这样,你完成了;您可以扩展您的应用程序,并根据需要路由所有消息。

但是,如果您想走路线 1,则必须提供多种配置

首先,您声明您使用 RabbitMQ 来路由命令和事件。事实上,该框架根本不允许使用 RabbitMQ 来路由命令。请注意,它是一种分发解决方案EventMessages,但不是CommandMessages。我建议在开源场景中使用JGroupsSpring CloudCommandBus来路由您的命令(我添加了指向有关分发JGroups 和 Spring Cloud 的参考指南页面的链接)。

要分发您的活动,您可以采用三种方法:

  1. 为您的活动使用共享数据库。
  2. 使用AMQP将您的事件发送到不同的实例。
  3. 使用Kafka将您的事件发送到不同的实例。

不过,我个人在启动应用程序时的偏好是从一个整体开始,并在必要时分开。我认为“进化微服务”这个词很好地抓住了这一点。

无论如何,如果您充分利用 Axon 支持的消息传递范式,那么在病房之后将命令端与查询端分开应该非常简单。如果您还使用 AxonHub 来分发您的消息,那么您实际上已经完成了。

最后,我没有从您的问题中找到非常准确的要求。这是否为您提供了继续进行所需的信息,@Federico Ponzi?

更新

经过一番思考,我认为您的解决方案非常简单。您正在使用 Spring Boot,并且想要设置您EventStore使用 MySQL。为了让 Axon 设置正确EventStorageEngine(在幕后用于读取/写入事件的 infra 组件),您可以简单地添加对spring-boot-starter-data-jpa. Axon 它的自动配置会在这种情况下自动注意到您的类路径上有 Spring Data JPA,因此将设置JpaEventStorageEngine.

于 2018-09-05T15:27:09.870 回答