ã€ãã³ãåŠçã¯ããµãŒããŒã¬ã¹ãã¯ãããžãŒã§æãäžè¬çãªã¿ã¹ã¯ã®1ã€ã§ãã 仿¥ã¯ãæå€±ãç¡å¹ã«ããä¿¡é Œã§ããã¡ãã»ãŒãžãã³ãã©ãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸãã ã¡ãªã¿ã«ãäŸã¯Pollyã©ã€ãã©ãªã䜿çšããŠCïŒã§èšè¿°ãããŠããŸããã瀺ãããŠããã¢ãããŒãã¯ãç¹ã«æå®ã®ãªãéããã©ã®èšèªã§ãæ©èœããŸãã
èè
ã«åºãæž¡ããŸãã
Azure Functionsã«ããå
ç¢ãªã€ãã³ãåŠç
æ°é±éåã
颿°ã䜿çšããŠã€ãã³ããé çªã«åŠçãã
æ¹æ³ã«é¢ããèšäºãå
¬éããŸããã æ¬æ¥ã®åºçç©ã§ã¯ãæå€±ãç¡å¹ã«ããä¿¡é Œã§ããã¡ãã»ãŒãžãã³ãã©ãäœæããæ¹æ³ã®æŠèŠã説æããŸãã ãã®èšäºã¯2ã€ãŸãã¯3ã€ã®éšåã«åããããšãã§ããŸããããã¹ãŠã®æ
å ±ã1ã€ã®è³æã«ãŸãšããããšã«ããŸããã çŽ æŽãããçµæãåŸãããŸããããåè·¯ãã¬ãŒã«ãŒãäŸå€ãã£ã«ã¿ãŒã®ãã¿ãŒã³ã䜿çšãããªã©ãåçŽãªãã®ããæãè€éãªãã®ãŸã§ãå¹
åºãã¿ã¹ã¯ãã«ããŒããŠããŸãã äŸã¯CïŒã§èšè¿°ãããŠããŸããã瀺ãããŠããã¢ãããŒãã¯ã©ã®èšèªã§ãæ©èœããŸãïŒç¹ã«æå®ããªãéãïŒã
忣ã·ã¹ãã ã®ã€ãã³ããããŒã«é¢é£ããåé¡
äžå®ã®é床ïŒããšãã°ã1ç§ããã100åïŒã§ã€ãã³ããéä¿¡ããã·ã¹ãã ãæ³åããŠãã ããã Azure Functionsã§ãããã®ã€ãã³ãã®åä¿¡ãæ§æããã®ã¯éåžžã«ç°¡åã§ãã ãããæ°åã§ããããã®100åã®ã€ãã³ããæ¯ç§åŠçãã倿°ã®åæã€ã³ã¹ã¿ã³ã¹ãæºåã§ããŸãã ãããããããªãã·ã£ãŒã誀ã£ãŠçæãããã€ãã³ããéä¿¡ããå Žåã¯ã©ããªããŸããïŒ ã€ã³ã¹ã¿ã³ã¹ã®1ã€ãé害ã®ããã«åäœã忢ããå Žåã¯ã©ããªããŸããïŒ ãŸãã¯ãããã«åŠçã¹ããããå®è¡ããã·ã¹ãã ã®1ã€ãã·ã£ããããŠã³ããŸããïŒ ã¢ããªã±ãŒã·ã§ã³ã®å
šäœçãªæŽåæ§ãšã¹ã«ãŒããããç¶æããªããããã®ãããªç¶æ³ã«å¯ŸåŠããæ¹æ³ã¯ïŒ
ãã¥ãŒã䜿çšãããšãã®ã¡ãã»ãŒãžåŠçã®ä¿¡é Œæ§ã確ä¿ããããšã¯ããããã«ç°¡åã§ãã Azure Functionsã§ã¯ããã¥ãŒããã®ã¡ãã»ãŒãžãåŠçãããšãã«ã颿°ã¯ãã®ãããªã¡ãã»ãŒãžãããããã¯ãããŠåŠçã詊ã¿ã倱æããå Žåã¯ããã¯ãè§£é€ããŠå¥ã®ã€ã³ã¹ã¿ã³ã¹ãåãå
¥ããŠå詊è¡ã§ããããã«ããŸãã ãããã®è©Šè¡ã¯ãã¡ãã»ãŒãžãæ£åžžã«åŠçããããã詊è¡ã®æå€§èš±å®¹åæ°ïŒããã©ã«ãã¯4ïŒã«éãããŸã§ç¶ããããŸãã 2çªç®ã®å Žåãã¡ãã»ãŒãžã¯çãããã¡ãã»ãŒãžã®ãã¥ãŒã«è¿œå ãããŸãã ãã¥ãŒããã®ã¡ãã»ãŒãžããã®è©Šè¡ãµã€ã¯ã«ãééããŠãããã¥ãŒããã®ä»ã®ã¡ãã»ãŒãžã®äžŠåæœåºã¯åæ¢ããŸããã ãããã£ãŠã1ã€ã®ãšã©ãŒã¯å
šäœçãªã¹ã«ãŒãããã«ã»ãšãã©åœ±é¿ããŸããã ãã ããã¹ãã¬ãŒãžãã¥ãŒã¯é åºãä¿èšŒããããµãŒãã¹ïŒã€ãã³ããããªã©ïŒã«é«ãã¹ã«ãŒããããæäŸããããã«æé©åãããŠããŸããã
ã€ãã³ãã¹ããªãŒã ïŒAzure Event Hubsãªã©ïŒã¯ããã¯ã䜿çšããŸããã ãããã®ãµãŒãã¹ã¯ãé«åž¯åå¹
ãæäŸããè€æ°ã®æ¶è²»è
ã°ã«ãŒããšãã¬ã€ã¢ããªãã£ããµããŒãããããã«èšèšãããŠããŸãã ã€ãã³ããåä¿¡ãããšãã€ãã³ãã¯ããŒããã©ã€ãã®ããã«æ©èœããŸãã ã¹ããªãŒã å
ã®åã»ã¯ã·ã§ã³ã«ã¯ã1ã€ã®ãªãã»ãããã€ã³ã¿ãŒããããŸãã åæ¹åã®ã€ãã³ããèªãããšãã§ããŸãã ã€ãã³ãã¹ããªãŒã ã®èªã¿åãäžã«ãšã©ãŒãçºçãããã€ã³ã¿ãŒãåãå Žæã«æ®ãããšã«ãããšããŸãã ç§»åãããŸã§ããã®ã»ã¯ã·ã§ã³ã®ããŒã¿ããã以äžåŠçããããšã¯ã§ããŸããã ã€ãŸããã·ã¹ãã ã1ç§ããã100åã®ã€ãã³ããåŒãç¶ãåä¿¡ããããAzure Functionsããã€ã³ã¿ãŒãæ°ããã€ãã³ãã«ç§»åããããšã忢ãã誀ã£ãã€ãã³ãã«å¯ŸåŠããããšãããšããžã£ã ãçºçããŸãã éåžžã«è¿
éã«å€§éã®æªåŠçã®ã€ãã³ããèç©ãããããã¯åžžã«æé·ããŸãã
äŸå€ãåŠçããŸããããã¥ãŒãé
å»¶ãããŸããããªãã»ãããã€ã³ã¿ãŒãšã³ã³ã·ã¥ãŒããŒã®ãã®åäœãèæ
®ãããŸããã
颿°ã¯ãåŠçãæåãããã©ããã«é¢ä¿ãªãããã€ã³ã¿ãŒãäžæµã«ç§»åããŸã ã ããã¯ãã·ã¹ãã ãšé¢æ°ããã®ãããªç¶æ³ã«å¯ŸåŠã§ããå¿
èŠãããããšãæå³ããŸãã
Azure Functionsãã€ãã³ãããããã€ãã³ããåãä»ããæ¹æ³
Azure Functionsã¯ã次ã®ããã«ã€ãã³ããããšå¯Ÿè©±ããŸãã
- ã€ãã³ãã³ã³ã»ã³ãã¬ãŒã¿ãŒã®åã»ã¯ã·ã§ã³ã«å¯ŸããŠããã€ã³ã¿ãŒãäœæããïŒAzureã¹ãã¬ãŒãžã«é
眮ãããŸãïŒïŒã¹ãã¬ãŒãžã¢ã«ãŠã³ãã§ç¢ºèªã§ããŸãïŒã
- ã€ãã³ãã³ã³ã»ã³ãã¬ãŒã¿ããæ°ããã¡ãã»ãŒãžãåä¿¡ãããšïŒããã©ã«ãã§ã¯ãããã¢ãŒãã§å®è¡ãããŸãïŒãããŒãã¯ã¡ãã»ãŒãžãã±ãããæž¡ããŠæ©èœãéå§ããããšããŸãã
- 颿°ãçµäºãããšïŒäŸå€ã®æç¡ã«é¢ä¿ãªãïŒããã€ã³ã¿ãŒãç§»åãããã®äœçœ®ããªããžããªã«ä¿åãããŸãã
- 颿°ã®å®äºã劚ãããã®ãããå ŽåãããŒãã¯ãã€ã³ã¿ãŒãç§»åã§ãããåŸç¶ã®ãã§ãã¯ã¯åãã¡ãã»ãŒãžãïŒåã®ã³ã³ãããŒã«ãã€ã³ãããïŒåä¿¡ããŸãã
- æé 2ã4ãç¹°ãè¿ãããŸãã
ããã§æ³šæãã¹ãããšãããã€ããããŸãã ãŸã
ãäŸå€ãåŠçããªããšãã¡ãã»ãŒãžã倱ãããå¯èœæ§ããããŸã ãäŸå€ãçºçããŠå®è¡ãå®äºããŠãããã€ã³ã¿ãŒãã·ããããããã§ãã 2çªç®ïŒ
颿°ã¯ãå°ãªããšã1åã®é
ä¿¡ãä¿èšŒããŸã ïŒããã¯ã忣ã·ã¹ãã ã§äžè¬çãªç¶æ³ã§ãïŒã ããã¯ãåãã¡ãã»ãŒãžã2ååä¿¡ãããç¶æ³ã§ãã³ãŒããšãã®äŸåã·ã¹ãã ãæ£ããæ©èœããããšãæå³ããŸãã 以äžã¯ããããã®2ã€ã®ç¶æ³ã®äŸãšããããã«å¯ŸåŠããããã®ã³ãŒãã§ãã
ãããã®ãã¹ãã®äžç°ãšããŠãã·ãŒã±ã³ã·ã£ã«åŠççšã«100,000ä»¶ã®ã¡ãã»ãŒãžãå
¬éããŸããïŒã»ã¯ã·ã§ã³ããŒããšïŒã é åºãšä¿¡é Œæ§ã確èªããŠèŠèŠåããããã«ãåŠçäžã®åã¡ãã»ãŒãžãRedisãã£ãã·ã¥ã«èšé²ããŸãã æåã®ãã¹ãã§ã¯ã100çªç®ã®ã¡ãã»ãŒãžããšã«äŸå€ãã¹ããŒãããäŸå€åŠçã¯å®è¡ãããŸããã
[FunctionName("EventHubTrigger")] public static async Task RunAsync([EventHubTrigger("events", Connection = "EventHub")] EventData[] eventDataSet, TraceWriter log) { log.Info($"Triggered batch of size {eventDataSet.Length}"); foreach (var eventData in eventDataSet) {
ãã®ã·ã¹ãã ã«100,000ä»¶ã®ã¡ãã»ãŒãžãéä¿¡ããåŸãRedisã¯æ¬¡ã®ããšã瀺ããŸããã

ã芧ã®ãšããã100çªãã112çªãŸã§ã®äžé£ã®ã¡ãã»ãŒãžãèŠéããŸããã ã©ããã ããæç¹ã§ã颿°ã®ã€ã³ã¹ã¿ã³ã¹ã®1ã€ããã®ã»ã¯ã·ã§ã³ããŒã®ã¡ãã»ãŒãžãã±ãããåä¿¡ããŸããã ãã®ç¹å®ã®ãã±ããã¯112çªç®ã®ã¡ãã»ãŒãžã§çµäºããŸããããã»ã«ã§äŸå€ãã¹ããŒãããŸããã å®è¡ã¯åæ¢ãããŸããããæ©èœããŒãã¯åŒãç¶ãåäœããæ¬¡ã®ãã±ãããèªã¿åããŸããã æè¡çã«ã¯ããããã®ã¡ãã»ãŒãžã¯ã€ãã³ãã³ã³ã»ã³ãã¬ãŒã¿ãŒã«ä¿åãããŠããŸããããå床åŠçããã«ã¯ã100çªç®ãã112çªç®ãŸã§ã®ã¡ãã»ãŒãžãæåã§èŠæ±ããå¿
èŠããããŸãã
try-catchãããã¯ã®è¿œå
ãã®åé¡ã解決ããæãç°¡åãªæ¹æ³ã¯ãåã«try / catchãããã¯ãã³ãŒãã«è¿œå ããããšã§ãã ããã§ãäŸå€ã®å Žåããã€ã³ã¿ãŒãããã«ç§»åããåã«åãããã»ã¹ã®äžéšãšããŠåŠçã§ããŸãã
äžèšã®ã³ãŒãã«catchãããã¯ã远å ããŠãã¹ããåéãããšã10äžä»¶ã®ã¡ãã»ãŒãžããã¹ãŠæ£ããé åºã§è¡šç€ºãããŸããã
æšå¥šäºé
ïŒãã¹ãŠã®ã€ãã³ããã颿°ã«ã¯catchãããã¯ãå¿
èŠã§ãããã®äŸã§ã¯ãcatchãããã¯ã䜿çšããŠRedisã«ããŒã¿ãæ¿å
¥ãã远å ã®è©Šã¿ãè¡ããŸããããéç¥ãéä¿¡ããããã¡ãã»ãŒãžãçããããã¥ãŒãŸãã¯ã€ãã³ãã³ã³ã»ã³ãã¬ãŒã¿ãŒã«è¿œå åŠçãããªã©ãä»ã®åŠ¥åœãªã¢ããªã±ãŒã·ã§ã³ãç°¡åã«èŠã€ããããšãã§ããŸãã
å詊è¡ã®ã¡ã«ããºã ãšããªã·ãŒ
çºçããäžéšã®äŸå€ã¯ãæã
çºçããå¯èœæ§ããããŸãã æäœãæ£ããå®è¡ããã«ã¯ãåã«ãããç¹°ãè¿ãã ãã§ååãªå ŽåããããŸãã åã®ã»ã¯ã·ã§ã³ã®ã³ãŒãã®catchãããã¯ã§ã¯ã1åã®å詊è¡ãå®è¡ãããŸãããã倱æãŸãã¯äŸå€ãçºçããå Žåãã¡ãã»ãŒãž100ã112ã倱ãããŸãã åŠçé åºãç¶æããªãããããæè»ãªå詊è¡ããªã·ãŒãæ§æã§ããããŒã«ã倿°ãããŸãã
ãã¹ãã®ããã«ããšã©ãŒåŠçã«
PollyãšããCïŒã©ã€ãã©ãªã䜿çšããŸããã 圌女ã¯ãåçŽãªãªãã©ã€ããªã·ãŒãšé«åºŠãªãªãã©ã€ããªã·ãŒã®äž¡æ¹ãèšå®ã§ããããã«ããŸããã äŸïŒããã®ã¡ãã»ãŒãžã3åæ¿å
¥ããŠã¿ãŠãã ããïŒè©Šè¡éã«é
å»¶ãããå¯èœæ§ããããŸãïŒã ãã¹ãŠã®è©Šè¡ã倱æããå Žåã¯ããã¥ãŒã«ã¡ãã»ãŒãžã远å ããŠã€ãã³ãã®åŠçãç¶è¡ããåŸã§æªåŠçã®ã¡ãã»ãŒãžãŸãã¯èª€ã£ãã¡ãã»ãŒãžã«æ»ãããã«ããŸãã
foreach (var eventData in eventDataSet) { var result = await Policy .Handle<Exception>() .RetryAsync(3, onRetryAsync: async (exception, retryCount, context) => { await db.ListRightPushAsync("events:" + context["partitionKey"], (string)context["counter"] + $"CAUGHT{retryCount}"); }) .ExecuteAndCaptureAsync(async () => { if (int.Parse((string)eventData.Properties["counter"]) % 100 == 0) { throw new SystemException("Some Exception"); } await db.ListRightPushAsync("events:" + eventData.Properties["partitionKey"], (string)eventData.Properties["counter"]); }, new Dictionary<string, object>() { { "partitionKey", eventData.Properties["partitionKey"] }, { "counter", eventData.Properties["counter"] } }); if(result.Outcome == OutcomeType.Failure) { await db.ListRightPushAsync("events:" + eventData.Properties["partitionKey"], (string)eventData.Properties["counter"] + "FAILED"); await queue.AddAsync(Encoding.UTF8.GetString(eventData.Body.Array)); await queue.FlushAsync(); } }
ãã®ã³ãŒãã§ã¯ããšã³ããªãäœæããã¹ããããã䜿çšããŠãRedisãã£ãã·ã¥ã«ã¡ãã»ãŒãžã远å ããŸãã
Redisã®æçµç¶æ
ïŒ

ããé«åºŠãªäŸå€ãã£ããã¡ã³ãããªã·ãŒãšå詊è¡ããªã·ãŒã䜿çšããå Žåãããªã³ã³ãã€ã«ãããCïŒã¯ã©ã¹ã©ã€ãã©ãªã«ã¯ãæ©èœã®ãäŸå€ãã£ã«ã¿ãŒããèšå®ã§ããæ©èœã®è©ŠçšçãçšæãããŠããããšã«æ³šæããŠãã ããã ããã䜿çšãããšã颿°ã®å®è¡äžã«æªåŠçã®äŸå€ãã¹ããŒããããšãã«å®è¡ãããã¡ãœãããäœæã§ããŸãã 詳现ããã³äŸã¯
ããã®åºçç©ã§å
¥æã§ããŸãã
äŸå€ã§ã¯ãªããšã©ãŒãšåé¡
ã³ãŒãã§äŸå€ãã¹ããŒããå Žåãæ€èšããŸããã ãããã颿°ã€ã³ã¹ã¿ã³ã¹ãããã»ã¹ã®äžæã«ééããå Žåã¯ã©ãã§ããããïŒ

æ¢ã«è¿°ã¹ãããã«ãFunctionãå®è¡ãå®äºããªãå Žåããªãã»ãããã€ã³ã¿ãŒã¯ãã以äžç§»åããŸãããã€ãŸããã¡ãã»ãŒãžãåä¿¡ããããšãããšãæ°ããã€ã³ã¹ã¿ã³ã¹ã¯åãããŒã¿ãåä¿¡ããŸãã ãã®ç¶æ³ãã·ãã¥ã¬ãŒãããããã«ã10äžã®ã¡ãã»ãŒãžã®åŠçäžã«é¢æ°ã¢ããªã±ãŒã·ã§ã³ãæåã§åæ¢ãéå§ãããã³åèµ·åããŸããã å·ŠåŽã«ã¯ãçµæã®äžéšã衚瀺ãããŸãã æ³šïŒãã¹ãŠã®ã€ãã³ããåŠçããããã¹ãŠãæ£åžžã«åŠçãããŠããŸãããäžéšã®ã¡ãã»ãŒãžã¯æ°ååŠçãããŸããïŒ700çªç®ä»¥éã601çªç®ä»¥éã®ã¡ãã»ãŒãžãåŠçãããŸããïŒã ãã®åäœã¯å°ãªããšã1åã®é
ä¿¡ãä¿èšŒãããããäžè¬ã«ããã¯è¯ãããšã§ãããããã¯ç§ã®ã³ãŒããããçšåºŠdemçã§ããã¹ãã§ããããšãæå³ããŸãã
ãµãŒããããã¬ãŒã«ãŒãšã³ã³ãã¢åæ¢
äžèšã®ãã¿ãŒã³ãšåäœââãã¿ãŒã³ã¯ãå詊è¡ãå®è£
ããã®ã«äŸ¿å©ã§ãã€ãã³ããåŠçããããã®ããããåªåãããã®ã«åœ¹ç«ã¡ãŸãã ç¹å®ã®ã¬ãã«ã®é害ã¯å€ãã®å Žå蚱容ãããŸãã ããããå€ãã®ãšã©ãŒãçºçããã·ã¹ãã ãæ£åžžã«æ©èœãããŸã§æ°ããã€ãã³ãã®æäœã忢ãããšããŸãã ããã¯ããµãŒããããã¬ãŒã«ãŒãã³ãã¬ãŒãã䜿çšããŠå®çŸã§ããŸããããã¯ãã€ãã³ãåŠçãã§ãŒã³ã忢ããåŸã§æäœãåéã§ããèŠçŽ ã§ãã
PollyïŒå詊è¡ãå®è£
ããã©ã€ãã©ãªïŒã¯ãããã€ãã®ãµãŒããããã¬ãŒã«ãŒæ©èœããµããŒãããŠããŸãã ãã ãããããã®ãã¿ãŒã³ã¯ãç¶æ
远跡ãªãã§ãã§ãŒã³ãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã«ãŸããã忣æé颿°ã®å Žåã®äœ¿çšã«ã¯ããŸãé©ããŠããŸããã Pollyã䜿çšããŠ
ãã®åé¡ã
解決ããæ¹æ³ã¯
ããã€ããããŸãããããã§ã¯å¿
èŠãªæ©èœãæåã§è¿œå ããŸãã ã€ãã³ãåŠçã§ãµãŒããããã¬ãŒã«ãŒãå®è£
ããã«ã¯ã2ã€ã®ã³ã³ããŒãã³ããå¿
èŠã§ãã
- åç·ã®ç¶æ
ã远跡ããã³ç£èŠããããã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®å
±éç¶æ
ã
- åè·¯ã®ç¶æ
ãå¶åŸ¡ã§ããïŒãªãŒãã³ãŸãã¯ã¯ããŒãºããïŒã¡ã€ã³ããã»ã¹ã
Redisãã£ãã·ã¥ãæåã®ã³ã³ããŒãã³ããšããŠäœ¿çšããAzureããžãã¯ã¢ããªã±ãŒã·ã§ã³ã2çªç®ã«ãªããŸããã ãããã®åœ¹å²ã¯äž¡æ¹ãšãä»ã®å€ãã®ãµãŒãã¹ã§å®è¡ã§ããŸãããç§ã¯ããã2ã€ã®ãµãŒãã¹ãæ°ã«å
¥ã£ãŠããŸãã
ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®æå€§èš±å®¹ãšã©ãŒæ°
è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãã€ãã³ãã䞊è¡ããŠåŠçã§ãããããåç·ã®ç¶æ
ãç£èŠããã«ã¯ãäžè¬çãªå€éšç¶æ
ãå¿
èŠã§ãã ã30ç§ä»¥å
ã«ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§100ãè¶
ãããšã©ãŒãåèšã§ç»é²ãããå Žåãåç·ãéããŠæ°ããã¡ãã»ãŒãžã®åŠçã忢ããããšããã«ãŒã«ãå®è£
ãããã£ãã®ã§ãã
Redis TTL远跡æ©èœãšãœãŒããããã»ããã䜿çšããŠãéå»30ç§éã®ãšã©ãŒæ°ãèšé²ããããŒãªã³ã°ééãååŸããŸããã ïŒè©³çްã«èå³ãããå Žåã¯ããããã®äŸã¯ãã¹ãŠ
GitHubã§å
¥æã§ã
ãŸã ãïŒæ°ãããšã©ãŒãçºçãããšããã¹ã©ã€ãééã«ç®ãåããŸããã ãšã©ãŒã®æå€§æ°ïŒéå»30ç§éã«100ãè¶
ããïŒãè¶
ããå Žåãã€ãã³ããAzure Event GridãµãŒãã¹ã«éä¿¡ããŸããã 察å¿ããRedisã³ãŒãã¯
ãã¡ãããå
¥æã§ã
ãŸã ã ãã®ãããåé¡ãæ€åºããã€ãã³ããéä¿¡ããŠåç·ãéãããšãã§ããŸããã
è«çã¢ããªã±ãŒã·ã§ã³ã䜿çšããåè·¯ç¶æ
管ç
ã¹ããŒããã«ã³ãã¯ã¿ãšãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã¯äºãã«å®å
šã«è£å®ãããããAzureããžãã¯ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãã§ãŒã³ã®ç¶æ
ãå¶åŸ¡ããŸããã åè·¯ãéãæ¡ä»¶ãããªã¬ãŒããããšãã«ãã¯ãŒã¯ãããŒïŒAzure Event GridãµãŒãã¹ã®ããªã¬ãŒïŒãéå§ããŸããã æåã®ã¹ãããã¯ãAzure Functionsã忢ãïŒAzure Resource Connectorã䜿çšïŒãéç¥ãªãã·ã§ã³ãšå¿çãªãã·ã§ã³ãå«ãé»åã¡ãŒã«ãéä¿¡ããããšã§ãã ãã®åŸããã¹ãŠãæ£åžžã«åäœããŠããã°ãåè·¯ã®åäœã確èªããŠåèµ·åã§ããŸãã ãã®çµæãã¯ãŒã¯ãããŒãåéãããæ©èœãèµ·åãããã€ãã³ãã³ã³ã»ã³ãã¬ãŒã¿ãŒã®æåŸã®ã³ã³ãããŒã«ãã€ã³ãããã¡ãã»ãŒãžåŠçãç¶è¡ãããŸãã
æ©èœã忢ããåŸã«ããžãã¯ã¢ããªã±ãŒã·ã§ã³ããåãåã£ãã¡ãŒã«ã å¿
èŠã«å¿ããŠãä»»æã®ãã¿ã³ãæŒããŠåè·¯ãåéã§ããŸããçŽ15ååã«10äžä»¶ã®ã¡ãã»ãŒãžãéä¿¡ãã100ä»¶ããšã«ã¡ãã»ãŒãžããšã©ãŒã«ãªãããã«ã·ã¹ãã ãã»ããã¢ããããŸããã çŽ5,000ä»¶ã®ã¡ãã»ãŒãžã®åŸããããå€ãè¶
ããã€ãã³ããAzure Event GridãµãŒãã¹ã«éä¿¡ãããŸããã ç§ã®Azureããžãã¯ã¢ããªã±ãŒã·ã§ã³ã¯ããã«åäœããæ©èœã忢ããã¡ãŒã«ãéä¿¡ããŸããïŒäžå³ãåç
§ïŒã Redisã®ã³ã³ãã³ããèŠããšãéšåçã«åŠçãããã»ã¯ã·ã§ã³ã倿°è¡šç€ºãããŸãã
ãªã¹ãã®äžçªäžã¯ããã®ã»ã¯ã·ã§ã³ããŒã®æåã®200ã¡ãã»ãŒãžã®åŠçã§ãããã®åŸãããžãã¯ã¢ããªã±ãŒã·ã§ã³ãã·ã¹ãã ã忢ããŸãããã¡ãŒã«ã®ãªã³ã¯ãã¯ãªãã¯ããŠããã§ãŒã³ãåéããŸããã Redisã§åãã¯ãšãªãå®è¡ãããšãã€ãã³ãã³ã³ã»ã³ãã¬ãŒã¿ãŒã®æåŸã®ã³ã³ãããŒã«ãã€ã³ãããæ©èœãç¶ç¶ããŠæ©èœããŠããããšãããããŸãã åäžã®ã¡ãã»ãŒãžã倱ãããããšã¯ãªãããã¹ãŠãå³å¯ãªé åºã§åŠçãããå¿
èŠãªã ãåè·¯ãéãããŸãŸã«ããããšã倿ããŸãããç¶æ
ã¯ç§ã®ããžãã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠå¶åŸ¡ãããŠããŸããã
åè·¯ãéããã³ãã³ãã®17ååã®é
å»¶ããã®æçš¿ããå
ç¢ãªã¡ãã»ãŒãžãããŒåŠçã®ããã®Azure Functionsã®ã¡ãœãããšãã³ãã¬ãŒãã®è©³çްã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ãã®ç¥èã«ããããœãªã¥ãŒã·ã§ã³ã®ä¿¡é Œæ§ãæãªãããšãªããæ©èœã掻çšããããšãã§ããŸãïŒç¹ã«ããªãœãŒã¹ãæ¶è²»ãããã³ã«æ©èœãåçã«æ¡åŒµããŠæéãæ¯æãïŒã
ãªã³ã¯ãã¯ãªãã¯ããŠããã®äŸã®ããŸããŸãªåç
§ãã€ã³ãã®åãã©ã³ããžã®ãã€ã³ã¿ãŒãæã€GitHubãªããžããª
ãèŠã€ããŸãã ã質åãããå Žåã¯ãTwitterã§@jeffhollanãŸã§ãé£çµ¡ãã ããã