使用Redis作为消息队列服务场景应用案例 (2)

下面我们将以异常日志为案例,介绍在.Net中如何采用消息队列的思想解决并发问题。当然,消息队列只是解决并发问题的其中一种方式,在实际中往往需要结合多种不同的技术方式来共同解决,比如负载均衡、反向代理、集群等方案。这里,虽然以异常日志为案例,但是“麻雀虽小五脏俱全”,日志写入文件的高并发操作也同样适用于数据库的高并发,所以,研究这个案例是具有实际意义的。

二、使用预置类型实现异常日志队列

使用Redis作为消息队列服务场景应用案例

在日常的Web应用中,异常日志的记录是一个十分重要的要点。因为,人无完人,系统也一样,难免会在什么时候出一个测试阶段未能完全测试到的异常。这时候,不能将异常信息直接显示给客户,那样既不友好也不安全。所以,一般都采用将异常信息记录到日志文件中(比如某个txt文件,数据库中某个表等),然后技术支持人员通过查看异常日志,分析异常原因,改进BUG重新发布,保障系统正常运行。

在用户的各种操作中,如果出现异常的时间一致,那么记录异常日志的操作就会成为并发操作,而记录异常日志又属于文件的IO操作(其实数据库的读写归根结底也是对文件即对磁盘进行的IO操作),因此很有可能带来并发控制的一系列问题。在以往的编码实践中,我们可以通过给不同的IO请求进行加锁(C#中的lock),等第一个请求完成写入后释放锁,第二个请求再获得锁,进行IO操作,然后释放掉,一直到第N个请求释放后结束。这种方式,虽然解决了并发操作带来的问题,但是通过加锁延迟了用户响应请求的时间(比如第一个正在IO写入操作时,后面的均处于等待状态),并且加锁也会给服务器带来一定的性能负担,造成服务器性能的下降。

基于以上原因,我们采用消息队列的思想将异常日志的记录操作改为队列版,这里我们先不采用Redis,直接使用.Net为我们提供的预置类型-Queue。接下来,就让我们动手开刀,写起来。

(1)新建一个ASP.NET MVC 4项目,选择“基本”类型,视图引擎选择“Razor”。

使用Redis作为消息队列服务场景应用案例

(2)既然是异常日志记录,首先得有异常。这时,我们脑海中想到了那个经典的异常:DividedByZeroException。于是,在Controllers文件夹中新建一个Controller,取名为Home(这里因为Global文件中的默认路由就指向了Home控制器中的Index这个Action),在HomeController中修改Index这个Action的代码如下:

复制代码

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzxwg.html