Code Monkey home page Code Monkey logo

cqrs-app-sample's Introduction

CQRS Application Sample

PHPを使って理解しやすいようなサンプルにしています。
実際に実践する場合は無理にPHPだけではやらずに適材適所な言語などを組み合わせてください。

Required

PHP(Laravel), Apache Kafka(& zookeeper), MySQL、Elasticsearch

Apache Kafka

recommended confluent platform

要件例

いくつかキーワードを投稿して、そのキーワードを見れるのはもちろんなんですが、
ワードクラウドみたいなものを実現したいんですよね!

キーワードはキーワードそのものと識別可能なユーザー情報、ここでは例としてuserIDだけにしましょう。
ワードクラウドライクなものはどう実現したらよいでしょう?
キーワードとはまた違う概念になりそう(コール数の概念が加わります)で、Elasticsearchを使えば実現できそうです。

処理の流れ

Command + Event Sourcing

  • PHP(フォーム)
  • MySQL(スナップショット/実際には他のものを利用してください)
  • Apache Kafka

読み込みモデル更新処理

  • ReadModel Handler(Laravel CLI)
  • Elasticsearch

supervisorやsystemdで動かすと良いでしょう。

Query

  • Elasticsearch
  • PHP

なぜLaravelのQueueを使わないのですか?

この処理だけではおそらく実現できますが、
現実問題として同じQueueの中身を他のプロセスが処理するケースもあるでしょう。
例えばブログを投稿した、をトリガーにキーワードの内容をpublishしたとします。

Elasticsearchにinsertする以外にRDBMSに正規化して持たせたい場合にどうすればいいでしょうか?
同じプロセスで処理する場合は2フェーズコミットになりそうです。
この場合、それぞれを担当するプロセスに分割した方は良さそうです。
必要とするのはラウンドロビンではない方法が望ましいです。

これはフレームワークの範囲を超えているので、専用のミドルウェアを使った方が良いでしょう。

Run

1. Setup

アプリケーションを動かす前に実行してください

$ 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

2. Elasticsearch

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

3. Topic Subscribe

$ docker-compose exec php /var/www/html/artisan sample:subscribe_es
$ docker-compose exec php /var/www/html/artisan sample:subscribe_mysql

cqrs-app-sample's People

Contributors

dependabot[bot] avatar ytake avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.