MQã«ã€ããŠç¥ããã£ãã
åæåŒã³åºã
ãã€ã¯ããµãŒãã¹éã®Feignã䜿ã£ãåŒã³åºãã¯åææ¹åŒã§ãããã€ãåé¡ããããã ã
äŸãã°ãæ¯æããµãŒãã¹ãéçºãããšããŠã泚æãµãŒãã¹ãå庫ãµãŒãã¹ã®ã³ãŒãã远å ããå¿ èŠããããããåŸã§SMSãµãŒãã¹ããã€ã³ããµãŒãã¹ã远å ããããšãããããã®éœåºŠæ¯æãã³ãŒããä¿®æ£ããªãããããªãããã㯠ãªãŒãã³ã»ã¯ããŒãºãã®åå ã«åãããããªã¯ãšã¹ããè¿ã£ãŠãããŸã§ä»ã®ããšãã§ããªãããããã©ãŒãã³ã¹ã®ç¡é§ã«ããªããã
åé¡ç¹ã¯ãçµå床ãé«ãããšãããã©ãŒãã³ã¹ãèœã¡ãããšããªãœãŒã¹ã®ç¡é§é£ãããããŠã«ã¹ã±ãŒãé害ïŒãããããã€ãã«åé¡ãèµ·ãããšããããåŒã³åºãå šãŠã®ãµãŒãã¹ãå·»ã蟌ãŸããŠããããåãã®ããã«ãã£ãšããéã«ãã€ã¯ããµãŒãã¹å šäœãããŠã³ãã¡ããïŒã ãã
éåæåŒã³åºãã®è§£æ±ºç
éåæåŒã³åºãã®äžè¬çãªå®è£ ã¯ãã€ãã³ãé§ååãã¿ãŒã³ã ãã
ãŠãŒã¶ãŒã®æ¯æããªã¯ãšã¹ã -> æ¯æããµãŒãã¹ -> Brokerããã®åŸãæ¯æããµãŒãã¹ãå®äºããŠå¿çããBrokerãæ³šæãµãŒãã¹ãå庫ãµãŒãã¹ãSMSãµãŒãã¹ã«éç¥ããä»çµã¿ã ã
å©ç¹ïŒãµãŒãã¹ã®ççµååãããã©ãŒãã³ã¹åäžãã¹ã«ãŒãããã®åäžããµãŒãã¹éã®åŒ·ãäŸåé¢ä¿ããªããªããé害åé¢ãå¯èœã«ãªããããšããã©ãã£ãã¯ã®ããŒã¯ãç·©åã§ããã®ããããã
æ¬ ç¹ïŒBrokerã®ä¿¡é Œæ§ãå®å šæ§ãã¹ã«ãŒãããèœåã«äŸåããããšãã¢ãŒããã¯ãã£ãè€éã«ãªãããããžãã¹ãããŒãæç¢ºãããªããã远跡ã管çãé£ãããªããã
MQ (ã¡ãã»ãŒãžãã¥ãŒ)
MessageQueueãã¡ãã»ãŒãžãã¥ãŒãæåéãã¡ãã»ãŒãžãæ ŒçŽãããã¥ãŒã®ããšã§ãã€ãã³ãé§ååã¢ãŒããã¯ãã£ã«ãããBrokerã®åœ¹å²ãæãããã ã
| RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
|---|---|---|---|---|
| äŒæ¥/ã³ãã¥ãã㣠| Rabbit | Apache | ã¢ãªãã | Apache |
| éçºèšèª | Erlang | Java | Java | Scala&Java |
| ãããã³ã«ãµããŒã | AMQPïŒXMPPïŒSMTPïŒSTOMP | OpenWire,STOMPïŒREST,XMPP,AMQP | ç¬èªãããã³ã« | ç¬èªãããã³ã« |
| å¯çšæ§ | é«ã | æ®é | é«ã | é«ã |
| åäžãµãŒããŒã®ã¹ã«ãŒããã | æ®é | æªã | é«ã | éåžžã«é«ã |
| ã¡ãã»ãŒãžé å»¶ | ãã€ã¯ãç§ã¬ãã« | ããªç§ã¬ãã« | ããªç§ã¬ãã« | ããªç§ä»¥å |
| ã¡ãã»ãŒãžä¿¡é Œæ§ | é«ã | æ®é | é«ã | æ®é |
å¯çšæ§ãéèŠãããªãïŒKafkaãRocketMQãRabbitMQ
ä¿¡é Œæ§ãéèŠãããªãïŒRabbitMQãRocketMQ
ã¹ã«ãŒãããèœåãéèŠãããªãïŒRocketMQãKafka
ã¡ãã»ãŒãžã®äœé å»¶ãéèŠãããªãïŒRabbitMQãKafka
RabbitMQã®ã€ã³ã¹ããŒã«
å ¬åŒãµã€ã ãèŠããšè²ã ãªã€ã³ã¹ããŒã«æ¹æ³ããããã©ãåã¯Dockerã䜿ã£ãŠãªã³ã©ã€ã³ã§ãã«ãããã
| |
å®è¡ã³ãã³ã
| |
localhost:15672 ã«ã¢ã¯ã»ã¹ããã°ç®¡çç»é¢ãéãããRabbitMQã®ããã€ãã®æŠå¿µã説æãããïŒ
- channelïŒMQãæäœããããã®ããŒã«
- exchangeïŒäº€ææ©ãã¡ãã»ãŒãžããã¥ãŒã«ã«ãŒãã£ã³ã°ãããã
- queueïŒãã¥ãŒãã¡ãã»ãŒãžãä¿åãããšããã
- virtualHostïŒä»®æ³ãã¹ãããã¥ãŒãäº€ææ©ãªã©ã®ãªãœãŒã¹ãè«ççã«ã°ã«ãŒãåãããã®ã
ã¡ãã»ãŒãžã¢ãã«
å ¬åŒãµã€ã ã«ã¯è²ã ãªãã¢ãæäŸãããŠããŠãããããç°ãªãã¡ãã»ãŒãžã¢ãã«ã«å¯Ÿå¿ããŠãããã
- åºæ¬ã¡ãã»ãŒãžãã¥ãŒ (BasicQueue)ïŒ “Hello World!”
- ã¯ãŒã¯ã¡ãã»ãŒãžãã¥ãŒ (WorkQueue)ïŒ Work Queues
- ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¢ãã«
- Fanout ExchangeïŒãããŒããã£ã¹ã Publish/Subscribe
- Direct ExchangeïŒã«ãŒãã£ã³ã° Routing
- Topic ExchangeïŒããã㯠Topics
ãããŒã¯ãŒã«ã
Publisher -> Queue -> Consumer
- publisherïŒã¡ãã»ãŒãžçºè¡è ãã¡ãã»ãŒãžããã¥ãŒã«éããã
- queueïŒã¡ãã»ãŒãžãã¥ãŒãã¡ãã»ãŒãžãåãåã£ãŠãã£ãã·ã¥ãã圹å²ã
- consumerïŒãã¥ãŒã賌èªããŠããã¥ãŒå ã®ã¡ãã»ãŒãžãåŠçãããã
çºè¡è
| |
åä¿¡è
| |
ã³ã³ãœãŒã«åºåïŒ
| |
æããã«ãã®æ¹æ³ã¯å°ãæéããããããã
SpringAMQP
SpringAMQP ã¯RabbitMQãåºç€ã«ã©ããããããã³ãã¬ãŒãéã§ãSpringBootãå©çšããŠèªåæ§æãå®çŸãããŠãããããããã䟿å©ã«äœ¿ãããã ã
- AMQP
Advanced Message Queuing Protocolã®ããšã§ãã¢ããªã±ãŒã·ã§ã³éã§ããžãã¹ã¡ãã»ãŒãžãããåãããããã®ãªãŒãã³ã¹ã¿ã³ããŒãã ãããã®ãããã³ã«ã¯èšèªããã©ãããã©ãŒã ã«äŸåããªãããããã€ã¯ããµãŒãã¹ã«ãããç¬ç«æ§ã®èŠæ±ã«ãã£ãšåèŽããŠãããã ã
- Spring AMQP
Spring AMQPã¯AMQPãããã³ã«ã«åºã¥ããŠå®çŸ©ãããAPI仿§ã§ãã¡ãã»ãŒãžãéåä¿¡ããããã®ãã³ãã¬ãŒããæäŸããŠããããspring-amqpãåºæ¬çãªæœè±¡åãspring-rabbitããã®åºç€ãšãªãããã©ã«ãå®è£ ã ãã
ããã¯ãã¥ãŒãäº€ææ©ããã®ãã€ã³ãã£ã³ã°é¢ä¿ãèªåã§å®£èšããŠãããããã¢ãããŒã·ã§ã³ããŒã¹ã®ãªã¹ããŒãã¿ãŒã³ã§éåæã«ã¡ãã»ãŒãžãåãåãããã ã
Basic Queue (ã·ã³ãã«ãªãã¥ãŒã¢ãã«)
ãŸãã¯èŠªãããžã§ã¯ãã§äŸåé¢ä¿ãå°å ¥ãããã
| |
publisher (ã¡ãã»ãŒãžéä¿¡)
application.ymlãèšå®ãããã
| |
RabbitTemplateã䜿ã£ãŠã¡ãã»ãŒãžéä¿¡ãå®è£ ãããã
| |
consumer (ã¡ãã»ãŒãžåä¿¡)
application.ymlã®èšå®ã¯äžèšãšåãã ãã
| |
æ°ããã¯ã©ã¹ SpringRabbitListener ãäœæãããã
| |
WorkQueue (ã¯ãŒã¯ã¡ãã»ãŒãžãã¥ãŒ)
TaskQueueãšãåŒã°ããŠããŠãã¿ã¹ã¯ã¢ãã«ã ããã¡ãã»ãŒãžåŠçé床ãäžããŠããã¥ãŒã«ã¡ãã»ãŒãžãæºãŸãã®ãé²ãããšãã§ãããã ã
publisher -> queue -> consumer1 and consumer2 and …
publisher (ã¡ãã»ãŒãžéä¿¡)
1ç§éã«50ä»¶ã®ã¡ãã»ãŒãžãéãã¡ãœãããå®çŸ©ãããã
| |
consumer (ã¡ãã»ãŒãžåä¿¡)
åããã¥ãŒã«2ã€ã®ã³ã³ã·ã¥ãŒããŒããã€ã³ããããã
| |
ãã¹ã
ãŸãåä¿¡è ãèµ·åããŠãããããéä¿¡è ãèµ·åããŠã¡ãã»ãŒãžãéã£ãŠã¿ããã
åºåçµæãèŠããšã2ã€ã®åä¿¡è ãããããååã®ã¡ãã»ãŒãžãåãåã£ãŠããããã€ãŸããã¡ãã»ãŒãžã¯åã³ã³ã·ã¥ãŒããŒã«åçã«åé ãããŠããŠãã³ã³ã·ã¥ãŒããŒã®åŠçèœåã¯èæ ®ãããŠããªããã ãããã ãšæããã«åé¡ãããããã
prefetch
application.ymlãã¡ã€ã«ãä¿®æ£ããŠãprefetchã®å€ãèšå®ããããããã§ããªãã§ããããã¡ãã»ãŒãžã®äžéïŒããã©ã«ãã¯ç¡éïŒãå¶åŸ¡ã§ãããã ã
| |
ããäžåºŠãã¹ãããŠã¿ããšãå®è¡å¹çãäžãã£ãŠããã®ãããããã
ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¢ãã«
ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¢ãã«ã¯äº€ææ©ïŒExchangeïŒãå ãã£ãŠãåãã¡ãã»ãŒãžãå šãŠã®åä¿¡è ã«éãããšãã§ãããã ã
publisher -> exchange -> queue1 and queue2 queue1 -> consumer1 and consumer2 queue2 -> consumer3
ãã䜿ãããExchangeã¯ãããã ãã
- FanoutïŒãããŒããã£ã¹ã
- DirectïŒã«ãŒãã£ã³ã°
- TopicïŒãããã¯
Exchangeã¯ã«ãŒãã£ã³ã°ãæ åœããã ãã§ãã¡ãã»ãŒãžã¯ä¿åããªãããã ãããã«ãŒãã£ã³ã°ã«å€±æãããšã¡ãã»ãŒãžã¯å€±ããã¡ãããã ã
Fanout (æåº) ãããŒããã£ã¹ã
Fanout Exchangeã¯åãåã£ãã¡ãã»ãŒãžããããã«ãã€ã³ããããŠããå šãŠã®ãã¥ãŒã«ãããŒããã£ã¹ããããã
åä¿¡è åŽã§èšå®ã¯ã©ã¹ãäœã£ãŠããã¥ãŒãšExchangeã宣èšãããã
| |
ã¡ãã»ãŒãžéä¿¡
| |
çãäžã空ã«ãªã£ãŠãã routingkey ã¯ã次ã®2ã€ã®ã¢ãã«ã§äœ¿ããã
ã¡ãã»ãŒãžã®åä¿¡
| |
Direct (ã«ãŒãã£ã³ã°)
Direct Exchangeã¯ãåãåã£ãã¡ãã»ãŒãžãã«ãŒã«ã«åºã¥ããŠæå®ããããã¥ãŒã«ã«ãŒãã£ã³ã°ãããããã«ãŒãã£ã³ã°ã¢ãŒãã£ãŠåŒã°ãããã ã
ãã¥ãŒãšExchangeã®ãã€ã³ãã«ã¯ Routingkey ãæå®ããå¿
èŠãããããéä¿¡åŽãã¡ãã»ãŒãžãéããšãã« Routingkey ãæå®ããªãããããªããã ããã¥ãŒã® Routingkey ãšã¡ãã»ãŒãžã® Routingkey ãå®å
šã«äžèŽããå Žåã ããã¡ãã»ãŒãžãåä¿¡ããããã
ããã§ã¯ã¢ãããŒã·ã§ã³ããŒã¹ã§ãã¥ãŒãšExchangeã宣èšãããããèšå®ã¯ã©ã¹ã¯äžèŠã ãã
| |
éä¿¡è
| |
äžã®äŸã ãšåä¿¡è
2ããã¡ãã»ãŒãžãåãåããªããã©ãããroutingkeyãredãªãäž¡æ¹ãšãã¡ãã»ãŒãžãåãåãããã
Topic (ãããã¯)
Topic Exchangeã¯Direct ExchangeãšäŒŒãŠãããã©ãéãã¯routingKeyãè€æ°ã®åèªã®ãªã¹ãã§ãïŒã§åºåãããŠããããšã ãã
ãã¥ãŒãšExchangeã§BindingKeyãæå®ããæã«ãã¯ã€ã«ãã«ãŒãã䜿ãããã
#ïŒ1ã€ä»¥äžã®åèªã«ããã*ïŒ1ã€ã®åèªã«ã®ã¿ããã
åä¿¡è
| |
ã¡ãã»ãŒãžéä¿¡
| |
äžã®äŸã ãš1ãš2ã®äž¡æ¹ãåãåãããã
| |
1ã ããåãåãããã
ã¡ãã»ãŒãžå€æåš
Springã¯éä¿¡ããã¡ãã»ãŒãžããã€ãåã«ã·ãªã¢ã©ã€ãºããŠMQã«éããã¡ãã»ãŒãžãåãåãæã¯ãã€ãåãJavaãªããžã§ã¯ãã«ãã·ãªã¢ã©ã€ãºãããã ããã ãããã©ã«ãã ãšSpringã䜿ãã·ãªã¢ã©ã€ãºæ¹æ³ã¯JDKã·ãªã¢ã©ã€ãºã§ãããŒã¿ãµã€ãºã倧ããããããã»ãã¥ãªãã£äžã®è匱æ§ããã£ãããå¯èªæ§ãäœãã£ãããããã ããã
JSONæ¹åŒã䜿ã£ãŠã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãºãããããšãã§ãããã
ãŸãã¯èŠªãããžã§ã¯ãã§äŸåé¢ä¿ãå°å ¥ãããã
| |
ã³ã³ã·ã¥ãŒããŒãšã¬ã·ãŒããŒã§Beanã宣èšããã ãã§ãããã ã
| |