ãã¡ãããç¶æ³ã¯æãå¿«é©ãªãã®ã§ã¯ãªããããå®å šã«ãã¬ã€ãã1å°ã§ã¯ãªã2å°ã®ãµãŒããŒãèµ·åããããšã«ããŸããã éåžžã¢ãŒãã§ã¯ããããã¯äžŠè¡ããŠåäœããåé¡ãå§ãŸããšãäºããä¿èšŒããŸããäžæ¹ãåããããäžæ¹ãäœãèµ·ãã£ãŠãããã«ã€ããŠå®å šãªè²¬ä»»ãè² ããŸãã ããããããã§ã¯ãµãŒããŒãã£ãã·ã¥ã®åæã«åé¡ãããããã®è§£æ±ºã®ããã«Redisãå¿ èŠã§ããã
次ã«ãRedisãšã®é£æºãå§ããçµç·¯ãšãã®çµæã«ã€ããŠå°ã説æããŸãã

ä»çµã¿
æåããå§ããŸãããïŒONLYOFFICEã¯nginx httpãµãŒããŒãšfastcgi-mono-server4ã¢ãžã¥ãŒã«ã§å®è¡ããã.netã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã
ããŒããã©ã³ã·ã³ã°ã«ã¯ãnginxã¢ãžã¥ãŒã«ngx_stream_upstream_moduleã䜿çšããŸããããã¯ãupstreamããã³fastcgi_passãã£ã¬ã¯ãã£ãã䜿çšããŠæ¬¡ã®ããã«æ§æãããŸãã
upstream fastcgi_backend { server 127.0.0.1:9000; server 127.0.0.1:9001; keepalive 64; } server { listen 80; location / { ... fastcgi_pass fastcgi_backend; ...
ã€ãŸãã2ã€ã®fastcgi-mono-server4ãµãŒããŒãã¢ãã¬ã¹127.0.0.1:9000ãš127.0.0.1:9001ã§åæã«èµ·åããnginxïŒåœŒã«æè¬ïŒïŒèŒªã«ãªã£ãŠè² è·ã®åæ£ãéå§ããŸãã
ãã®å Žåããã¹ãŠã®çä¿¡èŠæ±ã¯2ã€ã®ãµãŒããŒã«åçã«åæ£ãããŸããæåã®èŠæ±ã¯æåã®ãµãŒããŒã«éä¿¡ããã2çªç®ã®èŠæ±ã¯2çªç®ã®ãµãŒããŒã«ã3çªç®ã¯åã³æåã®ãµãŒããŒã«éä¿¡ãããŸãã
ãã£ãã·ã³ã°ã¯ãäœæ¥ãé«éåããããã«äœ¿çšãããŸãã ãã£ãã·ã¥ã«ãæãé »ç¹ã«äœ¿çšãããããŒã¿ãæ éã«ä¿åããŸãã ãããã«ã¯ãããšãã°ããŠãŒã¶ãŒãã°ã«ãŒãããŠãŒã¶ãŒã°ã«ãŒãã¡ã³ããŒã·ããã®é¢ä¿ãã¢ã¯ã»ã¹æš©ãããŒã¿ã«ãªã¹ãããµãã¹ã¯ãªãã·ã§ã³ã¢ã©ãŒããè«æ±æ å ±ãšã¯ã©ãŒã¿ãèšå®ãªã©ãå«ãŸããŸãã
ä»ãåé¡
äžã§è¿°ã¹ãããã«ãnginxã¯ãªã¯ãšã¹ããç°ãªããµãŒããŒã«åã§åé ããŸãã ãããšç¡æããŒãžã§ã³ã§ã¯ãã»ãã·ã§ã³ãç¹å®ã®IPã¢ãã¬ã¹ïŒãŠãŒã¶ãŒïŒã«åºå®ããããšãã§ããªãããããã£ãã·ã¥ã®äžäžèŽã«ããå€æ°ã®ãšã©ãŒãçºçããŸããã
ããšãã°ããŠãŒã¶ãŒãæåããå§ããŠãããŒã¿ã«ã§ååãå€æŽããããšã«ããŸããã å€æŽèŠæ±ã¯æåã®ãµãŒããŒã«éãããããã§ããŒããŒã®æ°ããååãããŒã¿ããŒã¹ã«ä¿åãããŸããã ã€ãã³ãæ å ±ã¯ãæåã®ãµãŒããŒã®ãã£ãã·ã¥ã«ããããŸãã ã€ãŸãã次ã®èŠæ±ã2çªç®ã®ãµãŒããŒã«å°çãããšã圌ã¯åã«çºçããå€æŽãèªèããŠããªãããšãããããŸãã ãŠãŒã¶ãŒã¯åã³å€ãååãèŠãŠãæ°ãã人çãå§ãŸã£ãŠããªãããšãç解ããŸãã ããã¯ãã¹ãŠã2çªç®ã®ãµãŒããŒã®ãã£ãã·ã¥å ã®æ å ±ãå€æŽãããŠããªããšããäºå®ã«ãããã®ã§ãã ãã¡ãããæŽæ°ãè¡ããã2çªç®ã®ãµãŒããŒã¯ãã¹ãŠãæ€åºããŸããããã£ãã·ã¥ãããŒã¿ããŒã¹ã®ããŒã¿ãšåæãããŠããæ°ååŸã«ãªããŸãã
ãããŠããã«åœŒã¯ãRedisã§ã
å®éããã®åé¡ã解決ããããã«ãONLYOFFICEãµãŒããŒã®å ±æãã£ãã·ã¥ãšããŠæ©èœããRedisãããžã§ã¯ãã䜿çšããããšã«ããŸããã ãã¡ãããããã§ãããã€ãã®å°é£ãçããŸããã 次ã«ãã©ããã©ã®ããã«å æãããã説æããŸãã
äž»ãªå°é£
StackExchange.Redis Nugetããã±ãŒãžã®åé¡
äœãæªãã£ãã®ã ïŒRedisãšã®é£æºãéžæããNugetããã±ãŒãžStackExchange.Redisã¯ãMonoãšã®é£æºãæåŠããŸããã ã€ã³ã¹ããŒã«åŸã.netã®ã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«èµ·åããŸããã ã¢ãã©ã«ã§ã¯ãäžå®ã®ãšã©ãŒãçºçããŸããïŒ
redisãµãŒããŒã«æ¥ç¶ã§ããŸããã§ããã åæããããã«ããã¬ã¯ãµãäœæããã«ã¯ãAbortOnConnectFailãç¡å¹ã«ããŸãã pingã§ã®ãœã±ããé害
圌ãã決ããããã«ãããã§ã¯ãã¹ãŠãç°¡åã§ãã Monoã®äžã®ãœãŒã¹ããStackExchange.Redis.dllãåéããŸããã
ããŒãžã®å¿çæéãå¢ãã
äœãåé¡ã ã£ãã®ã ïŒå€æ°ã®ãã£ãã·ã¥ã¢ã¯ã»ã¹ïŒãŠãŒã¶ãŒãªã¹ããã°ã«ãŒããã¢ã¯ã»ã¹æš©ã«é¢é£ãããã¹ãŠïŒãå«ãããŒãžãããã³ãã£ãã·ã¥ãããããŒã¿ãããªãã®éãå ããããŒãžïŒãã¹ãŠã®ããŒã¿ã«ã®ãªã¹ãïŒã¯ããªã¯ãšã¹ããžã®å¿çãé ããªãå§ããŸããã ããã§ãããããã®ããŒã¿ã¯å¥ã®ããã»ã¹ã®ã¡ã¢ãªãŸãã¯äžè¬ã«å¥ã®ç©çãã·ã³ã«ä¿åããããããã¯ãŒã¯ãœã±ãããä»ããŠã¢ã¯ã»ã¹ãããŸããããã¯ããã®ããã»ã¹ã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ãããããã¯ããã«äœéã§ãã
圌ãã決ããããã« ïŒãããæ°ãšããŒã¿ã®ãµã€ãºã«ãšã£ãŠéèŠãªãµã€ãã§ã¯ã以åãšåæ§ã«ããŒã«ã«ãã£ãã·ã¥ããããŸããããå°ããªéç¥ã·ã¹ãã ãããã«ãã蟌ã¿ãŸããã
ãã®ã¢ã«ãŽãªãºã ã«ãã£ãŠãã£ãã·ã¥ãããããŒã¿ãå€æŽãããã¹ãŠã®æ¹æ³ã§ãpublish / subscribe redisã¡ã«ããºã ã䜿çšããŠãå€æŽãããããŒã¿ã«é¢ããæ å ±ãéä¿¡ããã³ãŒããè¿œå ããŸããã ããã«ãã¢ã©ãŒããåä¿¡ãããã¹ãŠã®ãµãŒããŒã¯ã瀺ããããªããžã§ã¯ããããŒã¿ããŒã¹ãšåæããŸããã
é·æéã®éçšã®åé¡
åé¡ç¹ ïŒãŠãŒã¶ãŒããã¡ã€ã«æäœãéå§ãããšããã¥ãŒã«å ¥ããããã¿ã¹ã¯ãäœæãããŸãã 次ã«ãåã®ã¿ã¹ã¯ãã解æŸãããã¹ã¬ãããå®è¡ãéå§ããŸãã ã¹ã¬ããã®æ°ã¯ããã¡ã€ã«æäœã«ãããµãŒããŒã®éå°ãªè² è·ãåé¿ããããã«äžããå¶éãããŠããŸãïŒãã®æ©èœã¯TaskSchedulerã®ç¹æ®ããŒãžã§ã³ã«åºã¥ããŠå®è£ ãããŸããïŒã
ãã¡ã€ã«ã¿ã¹ã¯ã®å®è¡äžããŠãŒã¶ãŒã¯é²è¡ç¶æ³ã衚瀺ããã¿ã¹ã¯ã®å®äºæã«æåãŸãã¯ãšã©ãŒã«é¢ããæ å ±ã衚瀺ããŸãã ããã¯ãããã¥ã¡ã³ãAPIã¢ãžã¥ãŒã«ãä»ããŠãã¡ã€ã«æäœã®ã¹ããŒã¿ã¹ãå®æçã«ããŒãªã³ã°ããããšã«ããå®è£ ãããŸãããæäœã«é¢ãããã¹ãŠã®æ å ±ã¯ããŒã«ã«ããã»ã¹ãã£ãã·ã¥ã«ä¿åãããŸããã ããããè€æ°ã®ONLYOFFICEãµãŒããŒãèµ·åããããšãæäœã®ã¹ããŒã¿ã¹ã«é¢ãããªã¯ãšã¹ãã®äžéšããçŸåšã®ãã¡ã€ã«æäœãèµ·åããããµãŒããŒãšã¯ç°ãªããµãŒããŒã«å°éããŸããã ããã«ããããŠãŒã¶ãŒã®æäœã¹ããŒã¿ã¹ã®è¡šç€ºã«ãšã©ãŒãçºçããŸããïŒã¿ã¹ã¯ãçªç¶è¡šç€ºãŸãã¯é衚瀺ã«ãªããŸããïŒã
決å®éã ïŒåæ£ã¿ã¹ã¯ãããŒãžã£ãŒãäœæããŸããã å®è¡äžã®ã¿ã¹ã¯ã®ã¹ããŒã¿ã¹ãRedisã«ä¿åããã¯ãŒã«ãŒã¹ã¬ããã®æ°ãå¶éãããµãŒããŒéã§ã¿ã¹ã¯ã®ã¹ããŒã¿ã¹ãåæããå®å šã«çµ¶æçã«ãã³ã°ãããã®ãåé€ããŸãã
ã¡ãªã¿ã«ãMicrosoft.NET 4.0ã®æšæºSystem.Threading.TasksãããŒã¹ãšããŠäœ¿çšããŸããã
ã»ãã·ã§ã³ãããã€ããŒã®åé¡
åé¡ç¹ ïŒRedisã®ã»ãã·ã§ã³ãæ¿èªããããšã決å®ããMicrosoft Redisã»ãã·ã§ã³ãããã€ããŒã®ãã€ãã£ãRedisSessionStateProviderãéžæããŸããã å®éã«ã¯ãAzureãã©ãããã©ãŒã çšã«Microsoftã«ãã£ãŠäœ¿çšããã³ãµããŒããããŠããããããµãŒããŒã«ã€ã³ã¹ããŒã«ã§ããŸããããèªèº«ã®å±éºãšãªã¹ã¯ãããå Žåã«éããŸãã å€æããããã«ãWindowsã§ãåé¡ãªãåäœããŸãã ããããMonoã§ã¯ããã§ã¯ãããŸãããããã§ã¯ããã«å®å®ããåäœã«åé¡ããããå°ããªè² è·ã§ãããã€ããŒãNullReferenceExceptionã§ã¯ã©ãã·ã¥ããŸããã ãµãŒãããŒãã£ã®ãããã€ããŒãè©Šãããšã«ããŸããã ããããããã§ã¯åãNullReferenceExceptionãçºçããŸããã
決å®éã ïŒã»ãã·ã§ã³ãããã€ããŒã®å éšæ§é ãšãASP.NET for .NETã§ã®åŠçãMonoãšã©ã®ããã«ç°ãªãããç解ãå§ããŸããã ãªã¯ãšã¹ãã«Cookieãå«ãŸããªãå ŽåãMonoã®ããŒãžã§ã³ã®ã»ãã·ã§ã³IDã¯nullã«ãªãããããã€ããŒã¯ãã®ãããªãã£ãããæåŸ ããŠããŸããã nullã«ã»ãã·ã§ã³IDæ€èšŒãè¿œå ããŠpull-requestãäœæããŸããã
2ã€ã®ã»ãã·ã§ã³ãããã€ããŒã®ãã¡ããµãŒãããŒãã£ãããé«éã§è»œéã«æããããããããéžæããŸããã æ¥ç¶ããã«ã¯ãWeb.configã®æšæºãããã€ããŒã«çœ®ãæããå¿ èŠããããŸããã
<sessionState mode="Custom" customProvider="RedisSessionStateProvider"> <providers> <add name="RedisSessionStateProvider" type="RedisSessionProvider.RedisSessionStateStoreProvider, RedisSessionProvider" /> </providers> </sessionState>
ããã«ãã¢ããªã±ãŒã·ã§ã³ã®éå§æã«ããã€ãã®ã³ãŒããè¿œå ããå¿ èŠããããŸããã
var configuration = RedisCachingSectionHandler.GetConfig(); RedisConnectionConfig.GetSERedisServerConfig = (HttpContextBase context) => { if (configuration.RedisHosts != null && configuration.RedisHosts.Count > 0) { var host = configuration.RedisHosts[0]; return new KeyValuePair<string, ConfigurationOptions>("DefaultConnection", ConfigurationOptions.Parse(String.Concat(host.Host, ":", host.CachePort))); } return new KeyValuePair<string, ConfigurationOptions>(); };
ãŸãšã
ããã§ã¯ãå®äºããäœæ¥ãšãã®çµæã«æºè¶³ããŠãããšç°¡åã«èšããŸãã Redisã®ãããã§ããµãŒããŒã®åŸ©å åãšã¹ã±ãŒã©ããªãã£ã®äž¡æ¹ãåäžãããããšãã§ããŸãããããã¯ãå€æ°ã®ïŒããã«çµ¶ããæé·ããŠããïŒãŠãŒã¶ãŒãæ³å®ããŠããäŒæ¥ãµãŒããŒããŒãžã§ã³ã«äžå¯æ¬ ã§ãã
MonoãASP.Netã®æ°ããã¯ãã¹ãã©ãããã©ãŒã ããŒãžã§ã³ã«çœ®ãæããäºå®ã§ãã ãäºããèŠãŠããéã