Подтвердить что ты не робот

Акковые актеры и фьючерсы Akka: Понимание на примере

Я пытаюсь изучить актеров и фьючерсов Akka, но после прочтения документов на http://akka.io и http://doc.akka.io/docs/akka/2.0.2/intro/getting-started-first-java.html У меня все еще есть некоторые проблемы с пониманием. Я думаю, вычислить значение Pi это очень много людей, но не я =). У меня есть поиск вокруг немного но не нашли примеров, которые мне подходят. Поэтому я подумал, что возьму какой-то реальный код и брошу его сюда и обменяю его на пример того, как это сделать с Аккой.

Итак, вот мы идем:

У меня есть приложение java play2, где мне нужно взять некоторые данные из моего БД и проиндексировать его в моем экземпляре elasticsearch.

  • Я звоню в БД и получаю идентификаторы для мест.

  • Затем я разбил список и создаю пару вызываемых indextasks.

  • После этого я вызываю все задачи, где каждая задача собирает места для назначенных идентификаторов от db.

  • Для каждого места размещения укажите его в экземпляр elasticsearch и сделайте его доступным для поиска.

  • Готово.

Application.java:

public class Application extends Controller {

  private static final int VENUE_BATCH = 1000;
  private static int size;

  public static Result index() {

      List<Long> venueIds = DbService.getAllVenueIds();
      size = venueIds.size();
      Logger.info("Will index " + size + " items in total.");
      ExecutorService service = Executors.newFixedThreadPool(getRuntime().availableProcessors());
      int startIx = 0;
      Collection<Callable<Object>> indexTasks = new ArrayList<Callable<Object>>();
      do {
          int endIx = Math.min(startIx + VENUE_BATCH, size);
          List<Long> subList = venueIds.subList(startIx, endIx);
          VenueIndexTask indexTask = new VenueIndexTask(subList);
          indexTasks.add(indexTask);
      } while ((startIx += VENUE_BATCH) < size);

      Logger.info("Invoking all tasks!");
      try {
          service.invokeAll(indexTasks);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }

      return ok(index.render("Done indexing."));
  } 
}

VenueTask:

public class VenueIndexTask implements Callable<Object> {

    private List<Long> idSubList;

    public VenueIndexTask(List<Long> idSubList){
        this.idSubList = idSubList;
        Logger.debug("Creating task which will index " + idSubList.size() + " items. " +
                "Range: " + rangeAsString() + ".");
    }

    @Override
    public Object call() throws Exception {
        List<Venue> venues = DbService.getVenuesForIds(idSubList);
        Logger.debug("Doing some indexing: "+venues.size());

        for(Venue venue : venues) {
            venue.index();
        }
        return null;
    }
    private String rangeAsString() {
        return "[" + idSubList.get(0) + "-" + idSubList.get(idSubList.size() - 1) + "]";
    }
}

Место проведения:

@IndexType(name = "venue")
public class Venue extends Index {

    private String name;

    // Find method static for request
    public static Finder<Venue> find = new Finder<Venue>(Venue.class);

    public Venue() {
    }

    public Venue(String id, String name) {
        super.id = id;
        this.name = name;
    }

    @Override
    public Map toIndex() {
        HashMap map = new HashMap();
        map.put("id", super.id);
        map.put("name", name);
        return map;
    }

    @Override
    public Indexable fromIndex(Map map) {
        if (map == null) {
            return this;
        }
        this.name = (String) map.get("name");
        return this;
    }
}

Итак, все, что вы, Акка, там, орешки! И, пожалуйста, сделайте столько, сколько сможете, предложите удобные функциональные возможности фьючерсов, которые можно использовать, или любые другие знания/код, которые я мог бы использовать, чтобы изучить этот материал.

4b9b3361

Ответ 1

Как мне нравится думать о Akka (или любых других системах, основанных на сообщениях), думать о конвейерной ленте, как на фабриках. Упрощенный способ мышления в Актерах мог взять заказ пиццы.

  • Вы, голодный клиент (Актер/Роль) отправляют заказ (Сообщение) в магазин пиццы

  • Служба поддержки клиентов (Актер/Роль) принимает ваш заказ, дает вам номер заказа (Будущее)

  • Если вы были нетерпеливы, вы, возможно, ждали по телефону/интернету/магазину, пока не получили свою пиццу (синхронная/блокирующая транзакция), иначе вы были бы довольны номером заказа, чтобы проверить его позже (без блокировки)

  • Служба поддержки клиентов отправляет сообщение шеф-поварам (актеру) под руководством менеджера по кухне (Актер). Это очень сложная кухня с иерархией. Акке это нравится. См. Supervision

  • Шеф-повар создает новую пиццу и придает деталям заказа (новое сообщение) и передает его мальчику доставки (Актер) через менеджера доставки (Супервизор Актер).

  • Во время этого процесса ваши детали заказа не изменились, это был бы кошмар. Вы не были бы счастливы, если бы у вас был пепперони, если бы вы хотели простого сыра! Все сообщения должны быть неизменными! Однако может случиться так, что сообщение может отличаться для разных участников. Мальчик с доставкой ожидал бы, что пицца и детали заказа будут прикреплены, шеф-повар будет ожидать заказ. Когда сообщение необходимо изменить, создается новое сообщение.

  • Каждый актер хорош в одной роли, насколько эффективным было бы, если бы один парень должен был выполнять все задания? Возможно, некоторые актеры выделяют других (например, 10 тем для шеф-поваров, 2 для мальчиков доставки, 1 Customer Service).

  • Блокирование поведения - это боль, представьте себе, что обслуживание клиентов ждет шеф-повара и мальчика доставки, прежде чем увидеть следующего клиента?

Надеюсь, я немного помог вам, это огромная тема и большое изменение ума. Удачи.

Ответ 2

В настоящее время Coursera проводит курс по реактивному программированию, который имеет 3 последних лекции по Акке и модели актера. Это включает видео-лекции и домашние задания (в Scala хотя и не Java). Пока вы слишком поздно получаете полный сертификат, вы все равно можете присоединиться к курсу и просто проверить последние три недели.

https://class.coursera.org/reactive-001/class