
ã²ãŒã ã®ããŠã³ããŒãã¯ããªãè€éãªã¡ã«ããºã ã§ãããããã€ãã®æ®µéã§è¡ãããŸããå段éã§ã¯ãåæãããŒããŠã§ã¢é害ãéåžžã®ãã¡ã€ã¢ãŠã©ãŒã«ããããã€ããŒåŽââã®å¶éãªã©ãäœããã®çç±ã§é害ãçºçããå¯èœæ§ããããŸãã
ãã®ãããªå€æ§ãªç°å¢ã§ã®ã²ãŒã ã¯ã©ã€ã¢ã³ãã®ããŒãäžã«çºçãããšã©ãŒã®èšºæã¯ãå®å
šã«éèŠãªã¿ã¹ã¯ã«ãªããŸãã ãŸããGoogleã¢ããªãã£ã¯ã¹ãªã©ã®é«åºŠãªãœãªã¥ãŒã·ã§ã³ã䜿çšããŠããåé¡ãå®å
šã«è§£æ±ºãããããã§ã¯ãããŸããã ãã®ãããç¬èªã®ã²ãŒã ã¯ã©ã€ã¢ã³ãããŠã³ããŒã远跡ã·ã¹ãã ãèšèšããã³äœæããå¿
èŠããããŸããã
ãŸããã²ãŒã ã¯ã©ã€ã¢ã³ãã®ããŠã³ããŒãããã»ã¹ã詳ããèŠãŠã¿ãŸãããã ãœãŒã·ã£ã«ãããã¯ãŒã¯ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯HTMLããŒãžïŒä»¥éãåã«ãã£ã³ãã¹ïŒãæã€iframeèŠçŽ ã§ããããµãŒããŒäžã«ç©ççã«é
眮ãããŠããŸãã ãã£ã³ãã¹ãããŒãããåŸãã²ãŒã ã¯ã©ã€ã¢ã³ããåæåãããåã段éã§ãã©ãã·ã¥ãã¬ãŒã€ãŒãšãã®ããŒãžã§ã³ã®å¯çšæ§ã決å®ãããŸãã 次ã«ãã²ãŒã ã¯ã©ã€ã¢ã³ãããªããžã§ã¯ãã¿ã°ã®åœ¢åŒã§ããŒãžã«åã蟌ãŸããŸãã ãã®åŸãç§ãã¡ã«ãšã£ãŠæãèå³æ·±ã3ã€ã®äž»èŠãªæ®µéããããŸãã
- å®éã«CDNãããã¡ã€ã«ãããŠã³ããŒãããïŒçŽ3 MBïŒã
- ãœãŒã·ã£ã«ãããã¯ãŒã¯ã®APIã«æ¥ç¶ããå¿
èŠãªããŒã¿ãåä¿¡ããŸãã
- ã²ãŒã ãµãŒããŒã§ã®æ¿èªãšãªãœãŒã¹ã®èªã¿èŸŒã¿ã
äžå¯æåã®ç¶æ³ã¯ãããã段éã§çºçããå¯èœæ§ããããããããããç£èŠããŸãã å€éšã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããã²ãŒã ã¯ã©ã€ã¢ã³ãã¯ãåã¹ãããã®çµæïŒæåãšå€±æã®äž¡æ¹ïŒã«ã€ããŠãã£ã³ãã¹ã«éç¥ããŸãã ãã£ã³ãã¹ã«ã¯ãéä¿¡ãããæ
å ±ãä¿åãããå°ããªjavascript-libraryãå«ãŸããŠããŸãã ãã¹ãŠã®ããŒãæé ãå®äºãããšãããŒã¿ããµãŒããŒã«éä¿¡ãããŸãã
ããã«åºã¥ããŠãã·ã¹ãã ã®èšèšã«ãããäž»èŠãªã¿ã¹ã¯ãç°¡åã«èª¬æãããã®ããã®ä»¥äžã®èŠä»¶ã匷調ã§ããŸãã
- å€æ°ã®åæãªã¯ãšã¹ãã®åŠç-ãªã¯ãšã¹ããžã®éç¥ãšæéã®å¿çã
- IPã¢ãã¬ã¹ã«ãããŠãŒã¶ãŒã®åœããã³å°åã®ãªã¢ã«ã¿ã€ã ã®æ±ºå®ã
- æéã®çµéãšãšãã«æ¡å€§ãŸãã¯è£è¶³ãããå¯èœæ§ã®ããããŸããŸãªããŒã¿ã®ãã®ã³ã°ãããã³ãªã¢ã«ã¿ã€ã ãå«ãéçŽãããçµ±èšã®æäŸã
- åæã«æ¥ç¶ãããå€ãã®ã¯ã©ã€ã¢ã³ãã«ãªã¢ã«ã¿ã€ã ã§çµ±èšæ
å ±ãæäŸããŸãã
æããã«ããªã³ã©ã€ã³ç£èŠã®ããã®æ
å ±ãè¿
éã«æäŸããåçã«æ¡åŒµããã«ã¯ãã·ã¹ãã ãããŒã¿ããã£ãã·ã¥ã§ããå¿
èŠããããŸãã ããŒã¿ã¯ç¶ç¶çã«åä¿¡ãããåœãå°åã«é¢ããçµ±èšã¯ãã€ã§ãå¿
èŠã«ãªãå¯èœæ§ããããããéç¥ãå°çãããšãã«å°çæ
å ±ãå€æããå¿
èŠããããŸãã
ãŸããã¯ã©ã€ã¢ã³ãåŽã§ããŒã¿ãæŽæ°ããåæãªã¯ãšã¹ãã§ãµãŒããŒã®è² è·ãæŽæ°ãããšããåé¡ããããŸããã ãµãŒããŒããçµ±èšã衚瀺ããã«ã¯ãäœããã®æ¹æ³ã§ããŒã¿ãååŸããå¿
èŠããããŸãããã®ããã«ãéåžžããããããã³ã°ããŒãªã³ã°ãã¯ãããžãŒã䜿çšããŸãã
ãã³ã°ããŒãªã³ã°ãã¯ãããžãŒã䜿çšããå Žåãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«Ajaxãªã¯ãšã¹ããéä¿¡ãããµãŒããŒã«æ°ããããŒã¿ã衚瀺ãããã®ãåŸ
ã¡ãŸãã ããŒã¿ãåä¿¡ãããšããµãŒããŒã¯ãã®ããŒã¿ãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããã®åŸã¯ã©ã€ã¢ã³ãã¯æ°ãããªã¯ãšã¹ããéä¿¡ããŠåã³åŸ
æ©ããŸãã åé¡ãçºçããŸãïŒè€æ°ã®ã¯ã©ã€ã¢ã³ãããã®ãããªãªã¯ãšã¹ããåæã«åŠçãããããã®ã¯ã©ã€ã¢ã³ãã§åŠçãããããŒã¿ã®éãèšå€§ã«ãªããšã©ããªããŸãã æããã«ããµãŒããŒã®è² è·ã¯åçã«å¢å ããŸãã ã»ãšãã©ã®å Žåãåããªã¯ãšã¹ãããµãŒããŒã«éä¿¡ãããããšãç¥ã£ãŠããããããµãŒããŒãäžæã®ãªã¯ãšã¹ããäžåºŠåŠçããŠãããŒã¿ããŠãŒã¶ãŒã«éä¿¡ããããšãæã¿ãŸããã ã€ãŸããããã·ã¥éç¥ã¡ã«ããºã ã䜿çšãããŸããã
ããŒã«ãšãã¯ãããžãŒã®éžæã²ãŒã ã¯ã©ã€ã¢ã³ãããã®çä¿¡èŠæ±ã«å¯ŸããŠãåŸæ¥ã®ASHXãã³ãã©ãŒã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒéšåã.netã¢ãŒããã¯ãã£ã«å®è£
ããããšã決å®ãããŸããã ãã®ãããªãã³ãã©ãŒã¯ã.netã¢ãŒããã¯ãã£ãŒã§WebèŠæ±ãåŠçããããã®åºæ¬çãªãœãªã¥ãŒã·ã§ã³ã§ãããèŠæ±ãWebãµãŒããŒã®IISãã€ãã©ã€ã³ããã°ããééãããšããäºå®ã«ãããé·ãé䜿çšãããè¿
éã«æ©èœããŠããŸããã ããã¯ã»ã«ããä»ããŠéä¿¡ãããã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ããåŠçãããã³ãã©ãŒã1ã€ã ãå¿
èŠã§ãã ããã¯ã1x1ã€ã¡ãŒãžãã¯ã©ã€ã¢ã³ãã«æ¿å
¥ãããURLããµãŒããŒã«å¿
èŠãªããŒã¿ã転éããããã«æ§æãããŠããå Žåã®ã¢ãããŒããæããŸãã ãããã£ãŠãéåžžã®GETèŠæ±ãè¡ãããŸãã ãµãŒããŒåŽã§ã¯ããã®ãããªãªã¯ãšã¹ãããšã«ãIPã¢ãã¬ã¹ã§å°çæ
å ±ãç¹å®ãããã£ãã·ã¥ãšããŒã¿ããŒã¹ã«ããŒã¿ãä¿åããå¿
èŠããããŸãã ãããã®æäœã¯ãé«äŸ¡ãã§ããã€ãŸããäžå®ã®æéãå¿
èŠã§ãã ãããã£ãŠãéåæãã³ãã©ãŒã䜿çšããŸããèŠæ±ã«å¿ããŠãããŒã¿æ€èšŒã®ã¿ãæåŸ
ããïŒé«éïŒããã®åŸãéåæåŠçã®ããã«ããŒã¿ããã¥ãŒã«å
¥ããããå¿çãã¯ã©ã€ã¢ã³ãã«ããã«çæãããŸãã
ããŒã¿ã¹ãã¬ãŒãžã«ã¯ãNoSQLããŒã¿ããŒã¹ïŒMongoDBïŒãéžæããŸãããããã«ãããCode Firstã®ååã«åºã¥ããŠãšã³ãã£ãã£ãæ ŒçŽã§ããŸããã€ãŸããããŒã¿ããŒã¹æ§é ã¯ã³ãŒãå
ã®ãšã³ãã£ãã£ã«ãã£ãŠæ±ºå®ãããŸãã ããã«ãããŒã¿ããŒã¹æ§é ãæ¯åå€æŽããããšãªãããšã³ãã£ãã£ãåçã«å€æŽã§ããŸããããã«ãããã¯ã©ã€ã¢ã³ãããéä¿¡ãããä»»æã®ãªããžã§ã¯ããJSON圢åŒã§ä¿åãããããããããŸããŸãªéžæãè¡ãããšãã§ããŸãã ããã«ãæ°ããããŒã¿åã®æ°ããã³ã¬ã¯ã·ã§ã³ãåçã«äœæã§ããŸããããã¯ãæ°Žå¹³ã¹ã±ãŒãªã³ã°ã«æé©ã§ãã å®éãäžæã®è¿œè·¡ãªããžã§ã¯ãã¯ãããããã®ã³ã¬ã¯ã·ã§ã³ã«ä¿åãããŸãã
ã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ããåæããçµæãç°ãªãã¯ã©ã€ã¢ã³ãããã®åããªã¯ãšã¹ãã®å€§å€æ°ããµãŒããŒã«éä¿¡ãããç¹å®ã®å Žåã«ã®ã¿ç°ãªãããšãããããŸããïŒããšãã°ããªã¯ãšã¹ãåºæºãå€æŽããå ŽåïŒã lond pollingã«ä»£ãããã®ãšããŠã
Webãœã±ãã ïŒWebSocketïŒã䜿çšããããšã決å®ããŸãããããã«ãããåæ¹åã®ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®å¯Ÿè©±ãç·šæãããã£ãã«ãéãããéãããç¶æ
ãå€æŽããèŠæ±ã®ã¿ãéä¿¡ã§ããŸãã ãããã£ãŠãã¯ã©ã€ã¢ã³ã-ãµãŒããŒèŠæ±ã®æ°ãåæžãããŸãã ãã®ã¢ãããŒãã«ããããµãŒããŒäžã®ããŒã¿ãäžåºŠæŽæ°ãããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒã«ããã·ã¥éç¥ãéä¿¡ã§ããŸãã ãã®çµæããµãŒããŒåŽã§ã€ãã³ããããªã¬ãŒããããšãããŒã¿ãå³åº§ã«æŽæ°ããããµãŒããŒã§åŠçããããªã¯ãšã¹ãã®æ°ãåæžãããŸãã
ããã«ãWebãµãŒããŒãçŽæ¥äœ¿çšããã«ïŒããšãã°ããµãŒãã¹å
ã§ïŒäœæ¥ãæŽçã§ããŸãããŸããã¯ãã¹ãã¡ã€ã³ãªã¯ãšã¹ããšã»ãã¥ãªãã£ã«é¢ããäºçŽ°ãªåé¡ããªããªããŸãã
éç¥åŠçéåæãã³ãã©ãŒã¯ããã¯ã¹åããããœãªã¥ãŒã·ã§ã³ã§ããéåæãã³ãã©ãŒãäœæããã«ã¯ãIHttpAsyncHandlerããã¯ã©ã¹ãç¶æ¿ããå¿
èŠãªã¡ãœãããšããããã£ãå®è£
ããã ãã§ååã§ãã ã©ãããŒã¯ãIHttpAsyncHandlerãå®è£
ããæœè±¡ã¯ã©ã¹ïŒHttpTaskAsyncHandlerïŒãšããŠå®è£
ããŸããã IAsyncResultã¯ã¿ã¹ã¯ãä»ããŠå®è£
ãããŸããã ãã®çµæãHttpTaskAsyncHandlerã«ã¯ãHttpContextãååŸããŠã¿ã¹ã¯ãè¿ãå¿
èŠãªå®è£
ã¡ãœããã1ã€å«ãŸããŠããŸãã
public abstract Task ProcessRequestAsync(HttpContext context);
éåæASHXãã³ãã©ãŒãå®è£
ããã«ã¯ãHttpTaskAsyncHandlerããç¶æ¿ããProcessRequestAsyncãå®è£
ããã ãã§ååã§ãã
public class YourAsyncHandler : HttpTaskAsyncHandler { public override Task ProcessRequestAsync(HttpContext context) { return new Task(() => {
å®éãã¿ã¹ã¯èªäœã¯ã次ã®ã³ã³ããã¹ãã§ãªãŒããŒã©ã€ããããProcessRequestAsyncãä»ããŠäœæãããŸãã
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback callback, object extraData) { Task task = ProcessRequestAsync(context); if (task == null) return null; var returnValue = new TaskWrapperAsyncResult(task, extraData); if (callback != null) task.ContinueWith(_ => callback(returnValue ));
TaskWrapperAsyncResultã¯ãIAsyncResultãå®è£
ããã©ãããŒã¯ã©ã¹ã§ãã
public object AsyncState { get; private set; } public WaitHandle AsyncWaitHandle { get { return ((IAsyncResult)Task).AsyncWaitHandle; } } public bool CompletedSynchronously { get { return ((IAsyncResult)Task).CompletedSynchronously; } } public bool IsCompleted { get { return ((IAsyncResult)Task).IsCompleted; } }
EndProcessRequestã¡ãœããã¯ãã¿ã¹ã¯ãå®äºããããšã確èªããŸãã
public void EndProcessRequest(IAsyncResult result) { if (result == null) { throw new ArgumentNullException(); } var castResult = (TaskWrapperAsyncResult)result; castResult.Task.Wait(); }
éåæåŠçèªäœã¯ãã©ãããŒã®ContinueWithã®åŒã³åºããéããŠçºçããŸãã ASHXãã³ãã©ãŒã¯æ°ãããã®ãšã¯ã»ã©é ããããæšæºçãªåŒã³åºãã¯èŠèŠãããªããŸãïŒ../handlerName.ashxã ãã®çµæãIHttpHandlerFactoryãå®è£
ããŠHandlerFactoryãèšè¿°ããããIRouteHandlerãå®è£
ããŠã«ãŒãã£ã³ã°ãèšè¿°ãããã§ããŸãã
public class HttpHandlerRoute<T> : IRouteHandler { private readonly String _virtualPath; public HttpHandlerRoute(String virtualPath) { _virtualPath = virtualPath; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { var httpHandler = (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(_virtualPath, typeof(T)); return httpHandler; } }
ãã®åŸãåæåäžã«ããã³ãã©ãŒã®ã«ãŒããèšå®ããå¿
èŠããããŸãã
RouteTable.Routes.Add(new Route("notify", new HttpHandlerRoute<IHttpAsyncHandler>("~/Notify.ashx")));
éç¥ãåä¿¡ãããšããžãªããŒã¿ã¯IPã¢ãã¬ã¹ã«ãã£ãŠæ±ºå®ããïŒæ±ºå®ããã»ã¹ã«ã€ããŠã¯åŸè¿°ããŸãïŒãæ
å ±ã¯ãã£ãã·ã¥ãšããŒã¿ããŒã¹ã«æ ŒçŽãããŸãã
ããŒã¿ãã£ãã·ã³ã°ãã£ãã·ã¥ã¯
MemoryCacheã«åºã¥ããŠå®è£
ãããŸãã åšæçã§ãããã€ã³ã¹ã¿ã³ã¹ã®åç¶æéã®æå®ãããæéã®åŸããŸãã¯ã¡ã¢ãªå
ã®æå®ãããéãè¶
ãããšãã«ãå€ãããŒã¿ãèªåçã«åé€ããŸãã ããšãã°ã.configã䜿çšããŠããã£ãã·ã¥ãæäœããã³æ§æãããšäŸ¿å©ã§ãã
<system.runtime.caching> <memoryCache> <namedCaches> <add name="NotificationsCache" cacheMemoryLimitMegabytes="3000" physicalMemoryLimitPercentage="95" pollingInterval="00:05:00" /> </namedCaches> </memoryCache> </system.runtime.caching>
ãã£ãã·ã¥å
ã®ããŒã¿ã¹ãã¬ãŒãžã¯åæ£åœ¢åŒã§æ§æãããŠãããããäžå®æéããŒã¿ããã°ããåä¿¡ã§ããŸããã 以äžã¯ãã£ãã·ã¥å³ã§ãïŒ

æ¬è³ªçã«ããã£ãã·ã¥ã¯ããŒãšå€ã®ã³ã¬ã¯ã·ã§ã³ã§ãã ããã§ãããŒã¯ã¿ã€ã ã¹ã¿ã³ãïŒStringïŒã§ãããå€ã¯ã€ãã³ãã®ãã¥ãŒïŒQueueïŒã§ãã
ãã£ãã·ã¥å
ã®ã€ãã³ãã¯ãã¥ãŒã«å
¥ããããŸãã åãã¥ãŒã«ã¯ç¬èªã®äžæããŒãããããã®å Žåã¯1åã§ãã ãã®çµæãããŒã¯[year_month_day_hour_minute]ã®ããã«ãªããŸãã 圢åŒã®äŸïŒãntnKey_ {0ïŒy_MM_dd_HH_mm}ãã
æ°ããã€ãã³ãïŒéç¥ïŒããã£ãã·ã¥ã«è¿œå ãããšãäžæããŒã決å®ããããã¥ãŒãæ€åºãããããã«éç¥ãè¿œå ãããŸãã ãã¥ãŒãååšããªãå ŽåãçŸåšã®ããŒã«å¯ŸããŠæ°ãããã¥ãŒãäœæãããŸãã ãããã£ãŠãç¹å®ã®æéã®ããŒã¿ãååŸããã«ã¯ãäžæããŒã決å®ããã€ãã³ãã§ãã¥ãŒãååŸããã ãã§ååã§ãã å¿
èŠã«å¿ããŠãããã«ããŒã¿ãå€æã§ããŸãã
MongoDBããŒã¿ããŒã¹ã®ããŒã¿ã¹ãã¬ãŒãžãã£ãã·ã³ã°ãšäžŠè¡ããŠãéç¥ã¯
MongoDBã«ä¿åãããŸãã ãã®ããŒã¿ããŒã¹ã®ãã¹ãŠã®æ©èœãšå©ç¹ã«ã€ããŠã¯ãå
¬åŒWebãµã€ããã芧ãã ããã çŸåšãããŸããŸãªNoSQLããŒã¿ããŒã¹ãååšãããããå人ã®å¥œã¿ãã¿ã¹ã¯ã«åºã¥ããŠéžæããå¿
èŠããããŸãã ç§ããã¯ãMongoãšã®é£æºãç°¡åã§å¿«é©ã§ãããåçã«éçºãããŠããããšïŒããŒãžã§ã³3.0ãæ°ããWiredTigerãšã³ãžã³ãšå
±ã«æè¿ãªãªãŒã¹ãããïŒããããæäœããããã®.netãããã€ããŒããããæé©åããã³æŽæ°ãããŠãããšèšããããšæããŸãã ãã ããNoSQLããŒã¿ããŒã¹ã®äœ¿çšã¯ç¹å®ã®åé¡ã解決ããã®ã«é©ããŠããããšãããã³è©³çŽ°ãªåæãè¡ã£ãåŸã«ã®ã¿ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®ä»£ãããšããŠäœ¿çšããããšã¯äŸ¡å€ãããããšã¯æ³šç®ã«å€ããŸãã ä»æ¥ã§ã¯ã倧èŠæš¡ã¢ããªã±ãŒã·ã§ã³ã§ã®2ã€ã®ã¿ã€ãã®äœ¿çšãšãããçµ±åãããã¢ãããŒãããŸããŸãç»å ŽããŠããŸãã å
žåçãªã¢ããªã±ãŒã·ã§ã³ïŒãã®ã³ã°ã¡ã«ããºã ã®çœ®ãæããããã¯ãšã³ããªãã§NodeJSãšé£åãåçã«å€åããããŒã¿ãšã³ã¬ã¯ã·ã§ã³ã®ä¿åãCQRS +ã€ãã³ããœãŒã·ã³ã°ã¢ãŒããã¯ãã£ã䜿çšãããããžã§ã¯ããªã©ã è€æ°ã®ã³ã¬ã¯ã·ã§ã³ããããŒã¿ãéžæãããããµã³ãã«ã§ããŸããŸãªæäœãå®è¡ãããããå¿
èŠãããå Žåã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã䜿çšããããšããå§ãããŸãã

ç¹å®ã®ã±ãŒã¹ã§ã¯ãMongoDBã¯ããŸãæ©èœããçµ±èšã®ã°ã«ãŒãåã埪ç°ã¹ãã¬ãŒãžïŒç¹å¥ãªã€ã³ããã¯ã¹ã䜿çšããŠã¬ã³ãŒãã®ã©ã€ãã¿ã€ã ãèšå®ããæ©èœïŒãããã³ãžãªãµãŒãã¹ïŒåŸè¿°ïŒã䜿çšããé«éã¢ããããŒãã«äœ¿çšãããŸããã
ããŒã¿ããŒã¹ãæäœããããã«ãMongoDB CïŒ/ãNETãã©ã€ããŒã䜿çšãããŸããïŒå·çæç¹-ããŒãžã§ã³1.1ãæè¿ãªãªãŒã¹ãããããŒãžã§ã³2.0ïŒã äžè¬ã«ããã©ã€ããŒã¯æ£åžžã«æ©èœããŸãããã¯ãšãªãäœæãããšãã«BsonDocumentãªã©ã®ãªããžã§ã¯ãã®é¢åãªäœ¿çšãæ··ä¹±ãããŸãã
ãã©ã°ã¡ã³ãïŒ
var countryCodeExistsMatch = new BsonDocument { { "$match", new BsonDocument { { "CountryCode", new BsonDocument { {"$exists", true}, {"$ne", BsonNull.Value} } } } } };
ããŒãžã§ã³1.1ã¯ããã§ã«LINQã¯ãšãªããµããŒãããŠããŸãã
Collection.AsQueryable().Where(s => s.Date > DateTime.UtcNow.AddMinutes(-1 * 10) .OrderBy(d => d.Date);
ãããããããã¡ã€ã©ãŒã§åæãããšãã«å®éã«å€æããããã«ããã®ãããªèŠæ±ã¯ãã€ãã£ãïŒBsonDocumentïŒèŠæ±ã«å€æãããŸããã ãã®çµæãã³ã¬ã¯ã·ã§ã³å
šäœãã¡ã¢ãªã«ããŒããããç¹°ãè¿ãåŠçãããŸãããããã©ãŒãã³ã¹ã«ã¯ããŸãé©ããŠããŸããã ãããã£ãŠãBsonDocumentããã³ããŒã¿ããŒã¹ãã£ã¬ã¯ãã£ãã䜿çšããŠã¯ãšãªãèšè¿°ããå¿
èŠããããŸããã æè¿ãªãªãŒã¹ããã.NET 2.0ãã©ã€ããŒã§ç¶æ³ãä¿®æ£ãããããšãæåŸ
ããŸãããã
Mongoã¯
äžæ¬æäœ ïŒè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã®æ¿å
¥/å€æŽ/åé€ïŒããµããŒãããŠããŸããããã¯éåžžã«äŸ¿å©ã§ãããŒã¯è² è·ã«ããŸã察åŠã§ããŸãã ã€ãã³ãããã¥ãŒã«ä¿åããã ãã§ãNåã®éç¥ãå®æçã«ååŸããããŒã¿ããŒã¹ãžã®äžæ¬æ¿å
¥ãä»ããŠä¿åããäœæ¥ããã¯ã°ã©ãŠã³ãããã»ã¹ããããŸãã å¿
èŠãªã®ã¯ãã¹ã¬ãããåæãããã䞊è¡ã³ã¬ã¯ã·ã§ã³ã䜿çšããããšã ãã§ãã
ããŒã¹ã¯èªã¿åãã¢ãŒãã§ã¯ååã«é«éã§ãããé床ãäžããããã«
ã€ã³ããã¯ã¹ããå§ãã
ãŸã ã é©åãªã€ã³ããã¯ã¹ä»ãã®çµæããµã³ããªã³ã°ã¬ãŒããçŽ10åã«å¢å ããå¯èœæ§ããããŸãã ãããã£ãŠãã€ã³ããã¯ã¹ãäœæãããšãããŒã¿ããŒã¹ã®ãµã€ãºãå¢å ããŸãã
Mongoã®ãã1ã€ã®æ©èœã¯ãå¯èœãªéãRAMã«ããŒããããããšã§ããã€ãŸããèŠæ±ãããå ŽåãããŒã¿ã¯RAMã«æ®ããå¿
èŠã«å¿ããŠã¢ã³ããŒããããŸãã ããŒã¿ããŒã¹ã§äœ¿çšå¯èœãªRAMã®æ倧å€ãèšå®ããããšãã§ããŸãã
Aggregation PipelineãšåŒã°ããèå³æ·±ãã¡ã«ããºã ããããŸãã èŠæ±ã«å¿ããŠè€æ°ã®ããŒã¿æäœãå®è¡ã§ããŸãã çµæã¯ãã®ãŸãŸäŒããããå段éã§å€æãããŸãã
äŸãšããŠã¯ãããŒã¿ãéžæããŠã°ã«ãŒãåããçµæãäœããã®åœ¢åŒã§è¡šç€ºããå¿
èŠãããå Žåã®ã¿ã¹ã¯ããããŸãã ãã®åé¡ã¯æ¬¡ã®ããã«è¡šçŸã§ããŸãã
éžæã°ã«ãŒãåèŠå®ïŒ$äžèŽã$ã°ã«ãŒãã$ãããžã§ã¯ãã$ãœãŒãïŒã
以äžã¯ãåœã³ãŒãã§ã°ã«ãŒãåãããã€ãã³ããéžæããããã®ã³ãŒãã®äŸã§ãã
var countryCodeExistsMatch = new BsonDocument { { "$match", new BsonDocument { { "CountryCode", new BsonDocument { {"$exists", true}, {"$ne", BsonNull.Value} } } } } }; var groupping = new BsonDocument { { "$group", new BsonDocument { { "_id", new BsonDocument {{"CountryCode", "$CountryCode"}} }, { "value", new BsonDocument {{"$sum", 1}} } } } }; var project = new BsonDocument { { "$project", new BsonDocument { {"_id", 0}, {"hc-key","$_id.CountryCode"}, {"value", 1}, } } }; var sort = new BsonDocument { { "$sort", new BsonDocument { { "value", -1 } } } }; var pipelineMathces = requestData.GetPipelineMathchesFromRequest();
éžæã®çµæã¯IEnumerableã«ãªããå¿
èŠã«å¿ããŠjsonã«ç°¡åã«å€æã§ããŸãã
var result = Notifications.Aggregate(aggrArgs).ToJson(JsonWriterSettings);
ããŒã¿ããŒã¹ãæäœããèå³æ·±ãæ©èœã¯ãJSONãªããžã§ã¯ããBSONããã¥ã¡ã³ãã«çŽæ¥ä¿åã§ããããšã§ãã ãããã£ãŠãã¯ã©ã€ã¢ã³ãããããŒã¿ããŒã¹ãžã®ããŒã¿ã®ä¿åãæŽçããããšãã§ãã.netç°å¢ã¯ãåŠçãããªããžã§ã¯ããç¥ãå¿
èŠãããããŸããã åæ§ã«ãã¯ã©ã€ã¢ã³ãåŽããããŒã¿ããŒã¹ãžã®ã¯ãšãªãäœæã§ããŸãã ãã¹ãŠã®æ©èœãšæ©èœã®è©³çŽ°ã«ã€ããŠ
ã¯ãå
¬åŒããã¥ã¡ã³ããã芧ãã ãã
ããã®èšäºã®æ¬¡ã®éšåã§ã¯ããªã¯ãšã¹ãã®IPã¢ãã¬ã¹ãWebãœã±ãããããŒãªã³ã°ãµãŒããŒã®å®è£
ãAngularJSãHighchartsã«ãã£ãŠãžãªããŒã¿ã決å®ããã·ã¹ãã ã®ç°¡åãªåæãè¡ãGeoIPãµãŒãã¹ã«ã€ããŠèª¬æããŸãã