
èè ã«åºãæž¡ããŸãã
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) { // For every 100th message, throw an exception if (int.Parse((string)eventData.Properties["counter"]) % 100 == 0) { throw new SystemException("Some exception"); } // Insert the current count into Redis await db.ListRightPushAsync("events:" + eventData.Properties["partitionKey"], (string)eventData.Properties["counter"]); } }
ãã®ã·ã¹ãã ã«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ãŸã§ãé£çµ¡ãã ããã