26

私はAkkaの俳優と先物を学ぼうとしていますが、http://akka.ioのドキュメントを読み、http ://doc.akka.io/docs/akka/2.0.2/intro/getting-started-first を実行した後です。 -java.html まだ理解に問題があります。円周率の値を計算することは、多くの人が関係することもできることだと思いますが、私はそうではありません=)。少し調べてみましたが、自分に合った例は見つかりませんでした。したがって、実際のコードをここに入れて、Akkaでこれを行う方法の例と交換することを考えました。

さて、ここに行きます:

DBからデータを取得してelasticsearchインスタンスでインデックスを作成する必要があるJavaPlay2アプリケーションがあります。

  1. DBを呼び出して、会場のIDを取得します。

  2. 次に、リストを分割して、呼び出し可能なインデックスタスクをいくつか作成します。

  3. その後、すべてのタスクを呼び出します。各タスクは、割り当てられたIDの場所をデータベースから収集します。

  4. 会場ごとにelasticsearchインスタンスにインデックスを付け、検索可能にします。

  5. 終わり。

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;
    }
}

だから、そこにいるすべてのアカ族の人々は気が狂います!そして、できる限りのことをしてください。使用できるクールな未来の機能や、このようなことを学ぶために使用できるその他の知識/コードを提案してください。

4

2 に答える 2

22

私がAkka(または他のメッセージベースのシステム)について考えるのが好きなのは、工場のようにベルトコンベアのように考えることです。アクターの単純化された考え方は、ピザの注文を取ることかもしれません。

  • お腹を空かせた顧客(俳優/役割)がピザショップに注文(メッセージ)を送信します

  • カスタマーサービス(俳優/役割)が注文を受け取り、注文番号を提供します(将来)

  • せっかちな場合は、ピザを受け取るまで電話/インターネット/ショップで待っていた可能性があります(同期/ブロックトランザクション)。そうでない場合は、注文番号を後で確認して満足します(非ブロック)。

  • カスタマーサービスは、キッチンマネージャー(アクター)の監督下でシェフ(アクター)にメッセージを送信します。これは、階層を備えた非常にプロセスの重いキッチンです。アッカはそれが好きです。監督を参照してください

  • シェフは新しいピザを作成し、注文の詳細(新しいメッセージ)を添付して、配達マネージャー(スーパーバイザーアクター)を介して配達員(アクター)に渡します。

  • このプロセスの間、注文の詳細は変更されていません。これは悪夢です。プレーンチーズが欲しければ、ペパロニがあったら幸せではないでしょう!すべてのメッセージは不変でなければなりません!ただし、アクターによってメッセージが異なる場合があります。配達員はピザと注文の詳細が添付されていることを期待し、シェフは注文を期待します。メッセージを変更する必要がある場合は、新しいメッセージが作成されます。

  • 各俳優は1つの役割が得意ですが、1人の男がすべてのタスクを実行する必要があるとしたら、どれほど効果的でしょうか。一部のアクターが他のアクターよりも多い可能性があります(シェフの場合は10スレッド、配達員の場合は2スレッド、カスタマーサービスの場合は1スレッド)。

  • 行動をブロックするのは苦痛です。カスタマーサービスが次の顧客に会う前にシェフと配達員を待っていると想像してみてください。

少しお役に立てば幸いですが、これは大きなトピックであり、大きな心の変化です。幸運を

于 2014-01-07T13:52:54.697 に答える
1

Courseraは現在、リアクティブプログラミングに関するコースを運営しており、Akkaとアクターモデルに関する最後の3つの講義があります。これには、ビデオ講義と宿題が含まれます(JavaではなくScalaで)。完全な証明書を受け取るには遅すぎますが、コースに参加して過去3週間を確認することができます。

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

于 2013-12-19T08:54:46.247 に答える