ããã«ã¡ã¯ãHabrïŒ ãã®æçš¿ã¯ã
RailsConf 2018ã§ã®
Stella Cottonã®ããã©ãŒãã³ã¹ã®ããã¹ãé©å¿ã§ããã
Stella Cottonã«ããèšäº
ãRailsãšKafkaã䜿çšãããµãŒãã¹æåã¢ãŒããã¯ãã£ã®æ§ç¯ãã®ç¿»èš³ã§ãã
æè¿ãã¢ããªã·ãã¯ã¢ãŒããã¯ãã£ãããã€ã¯ããµãŒãã¹ãžã®ãããžã§ã¯ãã®ç§»è¡ãæ確ã«èŠãããŸãã ãã®ã¬ã€ãã§ã¯ãKafkaã®åºæ¬ãšãã€ãã³ãé§ååã¢ãããŒããRailsã¢ããªã±ãŒã·ã§ã³ãæ¹åããæ¹æ³ãåŠç¿ããŸãã ãŸããã€ãã³ãæåã®ã¢ãããŒãã§æ©èœãããµãŒãã¹ã®ç£èŠãšã¹ã±ãŒã©ããªãã£ã®åé¡ã«ã€ããŠã説æããŸãã
ã«ãã«ãšã¯äœã§ããïŒ
ãŠãŒã¶ãŒãã©ã®ããã«ãã©ãããã©ãŒã ã«ã¢ã¯ã»ã¹ããã®ããã©ã®ããŒãžã«ã¢ã¯ã»ã¹ããã®ããã©ã®ãã¿ã³ãã¯ãªãã¯ããã®ããªã©ã®æ
å ±ã欲ãããšæããŸãã æ¬åœã«äººæ°ã®ããã¢ããªã±ãŒã·ã§ã³ã¯ãæ°ååã®ã€ãã³ããçæããåæãµãŒãã¹ã«å€§éã®ããŒã¿ãéä¿¡ããå¯èœæ§ããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠæ·±å»ãªèª²é¡ã«ãªãå¯èœæ§ããããŸãã
ååãšããŠãWebã¢ããªã±ãŒã·ã§ã³ã®äžå¯æ¬ ãªéšåã«ã¯ããããã
ãªã¢ã«ã¿ã€ã ããŒã¿ãããŒãå¿
èŠã§ãã Kafkaã¯ã
ãããã¥ãŒãµãŒ ïŒã€ãã³ããçæãã
ãŠãŒã¶ãŒ ïŒãš
ã³ã³ã·ã¥ãŒã㌠ïŒãããã®ã€ãã³ããåä¿¡ãã
ãŠãŒã¶ãŒ ïŒéã®ãã©ãŒã«ããã¬ã©ã³ããªæ¥ç¶ãæäŸããŸãã 1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã«è€æ°ã®ãããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒãããå ŽåããããŸãã Kafkaã§ã¯ããã¹ãŠã®ã€ãã³ããäžå®æéååšãããããè€æ°ã®æ¶è²»è
ãåãã€ãã³ããäœåºŠãèªãããšãã§ããŸãã Kafkaã¯ã©ã¹ã¿ãŒã«ã¯ãKafkaã€ã³ã¹ã¿ã³ã¹ã§ãããããŒã«ãŒãããã€ãå«ãŸããŠããŸãã
Kafkaã®éèŠãªæ©èœã¯ãã€ãã³ãåŠçã®é«éæ§ã§ãã AMQPãªã©ã®åŸæ¥ã®ãã¥ãŒã·ã¹ãã ã«ã¯ãåã³ã³ã·ã¥ãŒãã®åŠçæžã¿ã€ãã³ããç£èŠããã€ã³ãã©ã¹ãã©ã¯ãã£ããããŸãã æ¶è²»è
ã®æ°ããŸãšããªã¬ãã«ãŸã§å¢å ããå Žåãã·ã¹ãã ã¯å¢å ããç¶æ
ãç£èŠããå¿
èŠããããããè² è·ã«ã»ãšãã©å¯ŸåŠãå§ããŸããã ãŸããã³ã³ã·ã¥ãŒããšã€ãã³ãåŠçã·ã¹ãã ã®äžè²«æ§ã«ã¯å€§ããªåé¡ããããŸãã ããšãã°ãã·ã¹ãã ã§åŠçãããã¡ãã»ãŒãžãããã«éä¿¡æžã¿ãšããŠããŒã¯ãã䟡å€ã¯ãããŸããïŒ ãããŠãæ¶è²»è
ãã¡ãã»ãŒãžãåä¿¡ããã«ããäžæ¹ã®ç«¯ã«èœã¡ããïŒ
Kafkaã«ã¯ãã§ã€ã«ã»ãŒãã¢ãŒããã¯ãã£ããããŸãã ã·ã¹ãã ã¯1ã€ä»¥äžã®ãµãŒããŒäžã§ã¯ã©ã¹ã¿ãŒãšããŠå®è¡ãããæ°ãããã·ã³ãè¿œå ããããšã§æ°Žå¹³æ¹åã«æ¡åŒµã§ããŸãã ãã¹ãŠã®ããŒã¿ã¯ãã£ã¹ã¯ã«æžã蟌ãŸããè€æ°ã®ãããŒã«ãŒã«ã³ããŒãããŸãã ã¹ã±ãŒã©ããªãã£ã®å¯èœæ§ãç解ããããã«ãNetflixãLinkedInãMicrosoftãªã©ã®äŒæ¥ãèŠãŠã¿ã䟡å€ããããŸãã ãããã¯ãã¹ãŠãKafkaã¯ã©ã¹ã¿ãŒãä»ããŠ1æ¥ã«æ°å
ã®ã¡ãã»ãŒãžãéä¿¡ããŸãïŒ
Railsã§ã®Kafkaã®ã»ããã¢ãã
Herokuã¯ãããããç°å¢ã§äœ¿çšã§ãã
Kafkaã¯ã©ã¹ã¿ãŒã¢ããªã³ãæäŸããŸãã rubyã¢ããªã±ãŒã·ã§ã³ã®å Žåã
ruby-kafka gemã®äœ¿çšããå§ãããŸãã æå°éã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
æ§æãæ§æããããgemã䜿çšããŠã¡ãã»ãŒãžãéä¿¡ã§ããŸãã ã€ãã³ãã®éåæéä¿¡ã®ãããã§ãã©ãããã§ãã¡ãã»ãŒãžãéä¿¡ã§ããŸãã
class OrdersController < ApplicationController def create @comment = Order.create!(params) $kafka_producer.produce(order.to_json, topic: "user_event", partition_key: user.id) end end
以äžã§ã·ãªã¢ã«å圢åŒã«ã€ããŠèª¬æããŸãããããã§ã¯ãå€ãè¯ãJSONã䜿çšããŸãã
topic
åŒæ°ã¯ãKafkaããã®ã€ãã³ããæžã蟌ããã°ãæããŸãã ãããã¯ã¯ããŸããŸãªã»ã¯ã·ã§ã³ã«åæ£ãããŠãããããç¹å®ã®ãããã¯ã®ããŒã¿ãããŸããŸãªãããŒã«ãŒã«åå²ããŠãã¹ã±ãŒã©ããªãã£ãšä¿¡é Œæ§ãåäžãããããšãã§ããŸãã ãŸãããããã¯ããšã«2ã€ä»¥äžã®ã»ã¯ã·ã§ã³ãçšæããããšããå§ãããŸããã»ã¯ã·ã§ã³ã®ããããã該åœããå Žåãã€ãã³ãã¯èšé²ãããåŠçãããŸãã Kafkaã¯ããããã¯å
šäœã§ã¯ãªããã»ã¯ã·ã§ã³å
ã®ãã¥ãŒã®é åºã§ã€ãã³ããé
ä¿¡ãããããã«ããŸãã ã€ãã³ãã®é åºãéèŠãªå Žåãpartition_keyãéä¿¡ãããšãç¹å®ã®ã¿ã€ãã®ãã¹ãŠã®ã€ãã³ããåãããŒãã£ã·ã§ã³ã«ä¿åãããŸãã
ããªãã®ãµãŒãã¹ã®ããã®ã«ãã«
Kafkaã䟿å©ãªããŒã«ã«ããæ©èœã®äžéšã¯ããµãŒãã¹éã®ãã§ãŒã«ãªãŒããŒRPCã«ããªããŸãã eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®äŸãèŠãŠã¿ãŸãããã
def create_order create_order_record charge_credit_card
ãŠãŒã¶ãŒã泚æãããšã
create_order
é¢æ°ã
create_order
ãŸãã ããã«ãããã·ã¹ãã ã§æ³šæãäœæãããã«ãŒããããéãå·®ãåŒããã確èªã®ã¡ãŒã«ãéä¿¡ãããŸãã ã芧ã®ãšãããæåŸã®2ã€ã®ã¹ãããã¯å¥ã
ã®ãµãŒãã¹ã§å®è¡ãããŸãã
ãã®ã¢ãããŒãã®åé¡ã®1ã€ã¯ãéå±€å
ã®äžäœãµãŒãã¹ãããŠã³ã¹ããªãŒã ãµãŒãã¹ã®å¯çšæ§ãç£èŠãã責任ãããããšã§ãã æçŽãéããµãŒãã¹ãæªãæ¥ã§ããããšãå€æããå Žåãäžäœã®ãµãŒãã¹ã¯ããã«ã€ããŠç¥ãå¿
èŠããããŸãã ãŸããéä¿¡ãµãŒãã¹ãå©çšã§ããªãå Žåã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ã»ãããç¹°ãè¿ãå¿
èŠããããŸãã ãã®ç¶æ³ã§ã«ãã«ã¯ã©ã®ããã«æ¯æŽã§ããŸããïŒ
äŸïŒ
ãã®ã€ãã³ãé§ååã®ã¢ãããŒãã§ã¯ãåªãããµãŒãã¹ã泚æãäœæããããšããã€ãã³ããKafkaã§èšé²ã§ããŸãã ãããã
å°ãªããšã1åã®ã¢ãããŒãã«ãããã€ãã³ãã¯å°ãªããšã1åKafkaã«èšé²ãããäžæµã®æ¶è²»è
ãé²èŠ§ã§ããããã«ãªããŸãã ã¡ãã»ãŒãžéä¿¡ãµãŒãã¹ãåãã€ããŠããå Žåãã€ãã³ãã¯ãã³ã³ã·ã¥ãŒããŒãç«ã¡äžãã£ãŠãããèªã¿åããŸã§ãã£ã¹ã¯äžã§åŸ
æ©ããŸãã
RPCæåã®ã¢ãŒããã¯ãã£ã®ãã1ã€ã®åé¡ã¯ãæ¥æé·ããŠããã·ã¹ãã ã«ãããŸããæ°ããããŠã³ã¹ããªãŒã ãµãŒãã¹ãè¿œå ãããšãã¢ããã¹ããªãŒã ã«å€æŽãå¿
èŠã«ãªããŸãã ããšãã°ã泚æãäœæããåŸã«ãã1ã¹ãããè¿œå ããããšããŸãã ã€ãã³ãé§ååã®äžçã§ã¯ãæ°ããã¿ã€ãã®ã€ãã³ããåŠçããå¥ã®ã³ã³ã·ã¥ãŒããŒãè¿œå ããå¿
èŠããããŸãã
ã€ãã³ãããµãŒãã¹æåã¢ãŒããã¯ãã£ã«çµ±åãã
Martin Fowlerã«
ãããã€ãã³ãé§åå ã
ãšã¯ã©ãããæå³ã§ãããšããã¿ã€ãã«ã®æçš¿ã§ã¯ãã€ãã³ãé§ååã¢ããªã±ãŒã·ã§ã³ã«é¢ããæ··ä¹±ã«ã€ããŠèª¬æããŠããŸãã éçºè
ããã®ãããªã·ã¹ãã ã«ã€ããŠè°è«ãããšãã圌ãã¯å®éã«ã¯èšå€§ãªæ°ã®ç°ãªãã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠè©±ããŠããŸãã ãã®ãããªã·ã¹ãã ã®æ§è³ªãäžè¬çã«ç解ããããã«ããã¡ãŠã©ãŒã¯ããã€ãã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãå®çŸ©ããŸããã
ãããã®ãã¿ãŒã³ãäœã§ããããèŠãŠã¿ãŸãããã ãã£ãšç¥ãããå Žåã¯ãGOTO Chicago 2017ã§åœŒã®
ã¬ããŒããèªãããšããå§ãããŸãã
ã€ãã³ãéç¥
æåã®Fowlerãã¿ãŒã³ã¯
Event NotificationãšåŒã°ããŸãã ãã®ã·ããªãªã§ã¯ããããã¥ãŒãµãŒãµãŒãã¹ã¯ãæå°éã®æ
å ±ã§ã€ãã³ããã³ã³ã·ã¥ãŒããŒã«éç¥ããŸãã
{ "event": "order_created", "published_at": "2016-03-15T16:35:04Z" }
æ¶è²»è
ãã€ãã³ãã«ã€ããŠããå€ãã®æ
å ±ãå¿
èŠãšããå Žåãæ¶è²»è
ã¯çç£è
ã«ãªã¯ãšã¹ããè¡ããããå€ãã®ããŒã¿ãååŸããŸãã
ã€ãã³ããéã¶ç¶æ
転é
2çªç®ã®ãã³ãã¬ãŒãã¯ã
Event-Carried State TransferãšåŒã°ããŸãã ãã®ã·ããªãªã§ã¯ããããã¥ãŒãµãŒã¯ã€ãã³ãã«é¢ããè¿œå æ
å ±ãæäŸããã³ã³ã·ã¥ãŒããŒã¯è¿œå ã®åŒã³åºããè¡ããã«ãã®ããŒã¿ã®ã³ããŒãä¿åã§ããŸãã
{ "event": "order_created", "order": { "order_id": 98765, "size": "medium", "color": "blue" }, "published_at": "2016-03-15T16:35:04Z" }
ã€ãã³ããœãŒã¹
Fowlerã¯ã3çªç®ã®ãã³ãã¬ãŒãã
Event-SourcedãšåŒã³ãããã¢ãŒããã¯ãã£çã§ãã ãã³ãã¬ãŒãã®ãªãªãŒã¹ã«ã¯ããµãŒãã¹éã®éä¿¡ã ãã§ãªããã€ãã³ãã®ãã¬ãŒã³ããŒã·ã§ã³ã®ä¿åãå«ãŸããŸãã ããã«ãããããŒã¿ããŒã¹ã倱ã£ãŠããä¿åãããã€ãã³ãã¹ããªãŒã ãå®è¡ããã ãã§ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã埩å
ã§ããŸãã ã€ãŸããåã€ãã³ãã¯ãç¹å®ã®ç¬éã«ã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ç¶æ
ãä¿åããŸãã
ãã®ã¢ãããŒãã®å€§ããªåé¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããåžžã«å€æŽããããããã¥ãŒãµãŒãæäŸããããŒã¿ã®åœ¢åŒãŸãã¯éãå€æŽãããå¯èœæ§ãããããšã§ãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®åŸ©å
ãåé¡ã«ãªããŸãã
ã³ãã³ãã¯ãšãªã®è²¬ä»»åé¢
æåŸã®ãã³ãã¬ãŒãã¯
Command Query Responsibility SegregationãŸãã¯CQRSã§ãã ã¢ã€ãã¢ã¯ããªããžã§ã¯ãã«é©çšããã¢ã¯ã·ã§ã³ãããšãã°ãäœæãèªã¿åããæŽæ°ãç°ãªããã¡ã€ã³ã«åå²ããããšã§ãã ã€ãŸãã1ã€ã®ãµãŒãã¹ãäœæãæ
åœããå¥ã®ãµãŒãã¹ãæŽæ°ãªã©ãæ
åœããå¿
èŠããããŸãã ãªããžã§ã¯ãæåã·ã¹ãã ã§ã¯ããã¹ãŠã1ã€ã®ãµãŒãã¹ã«æ ŒçŽãããããšããããããŸãã
ããŒã¿ããŒã¹ã«æžã蟌ããµãŒãã¹ã¯ãã€ãã³ãã®ã¹ããªãŒã ãèªã¿åããã³ãã³ããåŠçããŸãã ãã ããèŠæ±ã¯èªã¿åãå°çšããŒã¿ããŒã¹ã§ã®ã¿çºçããŸãã èªã¿åãããã³æžã蟌ã¿ããžãã¯ã2ã€ã®ç°ãªããµãŒãã¹ã«åå²ãããšãè€éããå¢ããŸããããããã®ã·ã¹ãã ã®ããã©ãŒãã³ã¹ãåå¥ã«æé©åã§ããŸãã
åé¡
KafkaããµãŒãã¹æåã¢ããªã±ãŒã·ã§ã³ã«çµ±åãããšãã«çºçããå¯èœæ§ã®ããããã€ãã®åé¡ã«ã€ããŠè©±ããŸãããã
æåã®åé¡ã¯ãé
ãæ¶è²»è
ã®ãã®ãããããŸããã ã€ãã³ãæåã·ã¹ãã ã§ã¯ããµãŒãã¹ã¯ãåªãããµãŒãã¹ããã€ãã³ããåãåã£ããšãã«å³åº§ã«åŠçã§ããå¿
èŠããããŸãã ããããªããšãåé¡ãã¿ã€ã ã¢ãŠãã«é¢ããã¢ã©ãŒãã衚瀺ãããã«åçŽã«ãã³ã°ããŸãã ã¿ã€ã ã¢ãŠããå®çŸ©ã§ããå¯äžã®å Žæã¯ãKafkaãããŒã«ãŒãšã®ãœã±ããæ¥ç¶ã§ãã ãµãŒãã¹ãã€ãã³ããååã«è¿
éã«åŠçããªãå Žåãæ¥ç¶ã¯ã¿ã€ã ã¢ãŠãã«ãã£ãŠäžæãããå¯èœæ§ããããŸããããã®ãããªãœã±ããã®äœæã«ã¯è²»çšããããããããµãŒãã¹ã®åŸ©å
ã«ã¯ããã«æéãããããŸãã
ã³ã³ã·ã¥ãŒããé
ãå Žåãã€ãã³ãåŠçã®é床ãã©ã®ããã«äžããããšãã§ããŸããïŒ Kafkaã§ã¯ãã°ã«ãŒãå
ã®æ¶è²»è
ã®æ°ãå¢ããããšãã§ãããããããå€ãã®ã€ãã³ãã䞊è¡ããŠåŠçã§ããŸãã ãã ãã1ã€ã®ãµãŒãã¹ã«å°ãªããšã2人ã®æ¶è²»è
ãå¿
èŠã§ãã1ã€ãèœã¡ãå Žåãç Žæããã»ã¯ã·ã§ã³ãåå²ãåœãŠã§ããŸãã
ãŸããã€ãã³ãåŠçã®é床ãç£èŠããããã®ã¡ããªãã¯ãšã¢ã©ãŒããçšæããããšãéåžžã«éèŠã§ãã
ruby- kafkaã¯ActiveSupportã¢ã©ãŒããšé£æºã§ããŸãããŸããStatsDããã³Datadogã¢ãžã¥ãŒã«ãããããããã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãã ããã«ãgemã¯ãæšå¥šãããç£èŠã¡ããªãã¯ã®
ãªã¹ããæäŸããŸãã
Kafkaã䜿çšããŠã·ã¹ãã ãæ§ç¯ãããã1ã€ã®éèŠãªåŽé¢ã¯ãé害ãåŠçããèœåãæã€æ¶è²»è
ã®èšèšã§ãã Kafkaã¯ãå°ãªããšã1åã€ãã³ããéä¿¡ããããšãä¿èšŒãããŠããŸãã ã¡ãã»ãŒãžããŸã£ããéä¿¡ãããªãã£ãå Žåãé€å€ããŸããã ãã ããæ¶è²»è
ãç¹°ãè¿ãçºçããã€ãã³ããåŠçããæºåãããããšãéèŠã§ãã ãããè¡ã1ã€ã®æ¹æ³ã¯ãåžžã«
UPSERT
ã䜿çšããŠããŒã¿ããŒã¹ã«æ°ããã¬ã³ãŒããè¿œå ããããšã§ãã åãå±æ§ãæã€ã¬ã³ãŒãããã§ã«ååšããå ŽåãåŒã³åºãã¯åºæ¬çã«éã¢ã¯ãã£ãã«ãªããŸãã ããã«ãåã€ãã³ãã«äžæã®èå¥åãè¿œå ãã以åã«åŠçãããã€ãã³ããåã«ã¹ãããããããšãã§ããŸãã
ããŒã¿åœ¢åŒ
Kafkaã䜿çšããéã®é©ãã®1ã€ã¯ãããŒã¿åœ¢åŒã«å¯ŸããåçŽãªæ
床ã§ãã ãã€ãåäœã§äœã§ãéä¿¡ã§ããæ€èšŒãªãã§ããŒã¿ãæ¶è²»è
ã«éä¿¡ãããŸãã äžæ¹ã§ãæè»æ§ãæäŸããããŒã¿åœ¢åŒãæ°ã«ããªãããã«ããŸãã äžæ¹ããããã¥ãŒãµãŒãéä¿¡ãããããŒã¿ãå€æŽããããšã決å®ããå Žåãäžéšã®ã³ã³ã·ã¥ãŒããŒãæçµçã«ç Žæããå¯èœæ§ããããŸãã
ã€ãã³ãæåã®ã¢ãŒããã¯ãã£ãæ§ç¯ããåã«ãããŒã¿åœ¢åŒãéžæããã¹ããŒã ã®ç»é²ãšéçºãä»åŸã©ã®ããã«åœ¹ç«ã€ããåæããŸãã
ãã¡ããã䜿çšãæšå¥šããã圢åŒã®1ã€ã¯JSONã§ãã ãã®åœ¢åŒã¯äººéãèªãã圢åŒã§ãããæ¢ç¥ã®ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã§ãµããŒããããŠããŸãã ããããèœãšãç©ŽããããŸãã ããšãã°ãJSONã®æçµããŒã¿ã®ãµã€ãºã¯æããã倧ãããªãå¯èœæ§ããããŸãã ãã®åœ¢åŒã¯ããŒãšå€ã®ãã¢ãä¿åããããã«å¿
èŠã§ããããã¯ååãªæè»æ§ããããŸãããããŒã¿ã¯åã€ãã³ãã§è€è£œãããŸãã ãã£ãŒã«ãã®ååãå€æŽããå¿
èŠãããå ŽåãããããŒãå¥ã®ããŒã«ãªãŒããŒã¬ã€ããçµã¿èŸŒã¿ãµããŒãããªããããã¹ããŒãã®å€æŽãé£ããã¿ã¹ã¯ã§ãã
KafkaãäœæããããŒã ã¯ãã·ãªã¢ã«åã·ã¹ãã ãšããŠ
Avroã«å©èšããŸãã ããŒã¿ã¯ãã€ããªåœ¢åŒã§éä¿¡ãããããã¯æã人éãèªãã圢åŒã§ã¯ãããŸããããå
éšã«ã¯åç·ã®ããä¿¡é Œã§ãããµããŒãããããŸãã Avroã®æåŸã®ãšã³ãã£ãã£ã«ã¯ãã¹ããŒããšããŒã¿ã®äž¡æ¹ãå«ãŸããŸãã Avroã¯ãæ°å€ãªã©ã®åçŽåãšæ¥ä»ãé
åãªã©ã®è€éãªåã®äž¡æ¹ããµããŒãããŠããŸããããã«ãã¹ããŒã å
ã«ããã¥ã¡ã³ããå«ããããšãã§ããŸããããã«ãããã·ã¹ãã å
ã®ç¹å®ã®ãã£ãŒã«ãã®ç®çãç解ã§ããã¹ããŒã ãæäœããããã®ãã®ä»ã®å€ãã®çµã¿èŸŒã¿ããŒã«ãå«ãŸããŠããŸãã
avro-builderã¯ãã¹ããŒããäœæããããã®ã«ããŒã®ãããªDSLãæäŸãã
Salsifyã«ãã£ãŠäœæãããgemã§ãã
ãã®èšäºã§ Avroã®è©³çŽ°ãèªãããšãã§ããŸãã
è¿œå æ
å ±
Kafkaããã¹ãããæ¹æ³ããHerokuã§ã®äœ¿çšæ¹æ³ã«é¢å¿ãããå Žåã¯ãèå³ã®ããã¬ããŒããããã€ããããŸãã
DataEngConf SF '17ã§ãžã§ããã£ãªãã
50,000ããŒãã£ã·ã§ã³ãè¶
ããïŒHerokuã倧èŠæš¡ã«Kafkaã®éçãæäœããã³ããã·ã¥ãã
æ¹æ³ ã
Dreamforce '16ã§ã®Pavel Pravosudã
Dogfooding KafkaïŒHerokuã®ãªã¢ã«ã¿ã€ã ãã©ãããã©ãŒã ã€ãã³ãã¹ããªãŒã ã®æ§ç¯æ¹æ³ ãã«ã³ãã¡ã¬ã³ã¹
çŽ æµãªæ¯è²ãïŒ