PHP(Laravel) / ES+CQRS Sample Application
PHPを使って理解しやすいようなサンプルにしています。 実際に実践する場合は無理にPHPだけではやらずに適材適所な言語などを組み合わせてください。
PHP(Laravel), Apache Kafka(& zookeeper), MySQL、Elasticsearch
recommended confluent platform
いくつかキーワードを投稿して、そのキーワードを見れるのはもちろんなんですが、 ワードクラウドみたいなものを実現したいんですよね!
キーワードはキーワードそのものと識別可能なユーザー情報、ここでは例としてuserIDだけにしましょう。 ワードクラウドライクなものはどう実現したらよいでしょう? キーワードとはまた違う概念になりそう(コール数の概念が加わります)で、Elasticsearchを使えば実現できそうです。
supervisorやsystemdで動かすと良いでしょう。
この処理だけではおそらく実現できますが、 現実問題として同じQueueの中身を他のプロセスが処理するケースもあるでしょう。 例えばブログを投稿した、をトリガーにキーワードの内容をpublishしたとします。
Elasticsearchにinsertする以外にRDBMSに正規化して持たせたい場合にどうすればいいでしょうか? 同じプロセスで処理する場合は2フェーズコミットになりそうです。 この場合、それぞれを担当するプロセスに分割した方は良さそうです。 必要とするのはラウンドロビンではない方法が望ましいです。
これはフレームワークの範囲を超えているので、専用のミドルウェアを使った方が良いでしょう。
アプリケーションを動かす前に実行してください
$ docker-compose up -d
# 各ミドルウェアはコンテナですが起動に時間がかかります。
# しばらくお待ちください。
# これらのミドルウェアを使う場合、商用ではコンテナではなく物理的HDDで動かしましょう。
$ docker-compose exec php composer install --prefer-dist --no-interaction && composer app-setup
$ docker-compose exec php /var/www/html/artisan migrate
tokenizerなどを設定します。
$ curl -X PUT 'http://localhost:9200/words' -H 'Content-Type: application/json' -d @dataset/mapping.json
$ curl -X POST 'http://localhost:9200/_bulk?pretty' -H 'Content-Type: application/json' --data-binary @dataset/words.json
$ docker-compose exec php /var/www/html/artisan sample:subscribe_es
$ docker-compose exec php /var/www/html/artisan sample:subscribe_mysql