Лучшие практики дизайна на vertx. Eventbus или Singleton для репозиториев

я использую вертх3

Мне нужно использовать Redis, чтобы устанавливать и получать значения (в будущем Redis может быть изменен на что-то другое).

Я ищу лучший дизайн для своей реализации.

Я работаю над кластером вершин, и мне нужно получить сообщения через шину событий, извлечь сообщение и вставить в Redis.

С другой стороны, я могу получать запросы через Интернет, а также извлекать сообщения и вставлять их в Redis.

Два варианта:

  1. Должен ли я иметь «redis-verticle», который получает сообщения через шину и записывает их.

  2. Должен ли я создать «Вертикул слушателя», который будет содержать DAO, который будет содержать объект RedisRepo, который будет их записывать.

    Я также смогу обрабатывать веб-вызовы и удерживать этот объект DAO.

Если бы я был в весеннем приложении, я бы создал DAO, который содержит RedisRepo и внедрил бы его в мой сервисный уровень, но здесь мы получили шину событий, поэтому я не уверен.

(кстати, источник данных Redis меня изменить на что-то другое, поэтому я должен подумать об общих оболочках)

1. 

public class RedisRepoVerticle extends AbstractVerticle {

...
 public void start() {
 client = new RedisClient("localhost", 6379);
                 connection = client.connect();
...

vertx.eventBus().consumer("redis-operation", (handler) -> {
            {
                JsonObject msg = new JsonObject(handler.body().toString());
               //write straight to Redis 

            }
        });

}






2. 

     public class RedisMessageListener extends AbstractVerticle {
        DatasourceDAO datasource
        ...
         public void start() {
         client = new RedisClient("localhost", 6379);
                         connection = client.connect();
    ...

    vertx.eventBus().consumer("redis-operation", (handler) -> {
                {
                    JsonObject msg = new JsonObject(handler.body().toString());
                   datasourceDAO.writeToRedis(..); 

                }
            });

    }

//datasourceDAO will hold RedisRepo object

Если я выберу второй вариант, должен ли я начать поддерживать синглтоны? Я не хочу дублировать свои дао, которые будут дублировать классы моего редисрепо.


person rayman    schedule 08.09.2015    source источник
comment
были ли у вас какие-либо идеи в этом вопросе?   -  person Noam Nevo    schedule 14.03.2016


Ответы (1)


Я думаю, что было бы лучше реализовать второй случай, создать отдельную вершину, которая будет содержать клиента Redis, и отдельную вершину, которая будет принимать, обрабатывать и передавать запросы Redis. У каждой вершины должен быть отдельный пул подключений, и у вас могут возникнуть проблемы с поддержкой нескольких пулов соединений в будущем при создании отдельных подключений от каждой вершины к Redis.

Репликация DAO здесь неуместна. Я бы посоветовал вам взглянуть на https://github.com/vert-x3/vertx-service-proxy. Это подпроект vert.x, который может помочь вам понять, что такое вершина. Вы должны рассматривать вертикул как сервис (или, в частности, DAO), который предоставляет набор методов. Он ведет себя как синглтон, то есть вы не создаете новые экземпляры вершины по запросу, но их может быть более одного экземпляра в зависимости от конфигурации (http://vertx.io/docs/vertx-core/groovy/#_specifying_number_of_verticle_instances).

person meshuga    schedule 13.09.2015
comment
vertx-service-proxy по-прежнему показывает пример хранения нескольких сервисов и передачи их с помощью event-us. Здесь я говорю о хранении дао и репозиториев и делегировании их в рамках сервисов. что ты думаешь? - person rayman; 15.09.2015