.NET文件并发与RabbitMQ(初探RabbitMQ)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了.NET文件并发与RabbitMQ(初探RabbitMQ),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3934字,纯文字阅读大概需要6分钟。
内容图文
![.NET文件并发与RabbitMQ(初探RabbitMQ)](/upload/InfoBanner/zyjiaocheng/1315/72716fc9a22949b2baf08a51fcde34e4.jpg)
本文版权归博客园和作者吴双本人共同所有。欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html
想必MQ这两个字母对于各位前辈们和老司机们并不陌生。本文初探RabbitMQ的简单分享可能值得学习之处不怎么多,本人对于RabbitMQ的研究目前也很初级,这个月打算按照好的学习线路提高一下,欢迎新老司机留下你们的见解。
首先提到第一个简单的场景,文件并发。我先手动实现一下文件并发,引发异常,请看如下代码。
1 static void Main(string[] args) 2 { 3new Thread(write1).Start(); 4new Thread(write1).Start(); 5new Thread(write1).Start(); 6 Console.WriteLine("等待"); 7 Console.ReadKey(); 8 } 9publicstaticvoid write1() 10 { 11for (int i = 0; i < 10000; i++) 12 { 13 WriteLog(i); 14 } 15//Console.ReadKey();16 } 17publicstaticvoid WriteLog(int i) 18 { 19using (FileStream f = new FileStream(@"d:\\A.txt", FileMode.Append)) 20 { 21using (StreamWriter sw = new StreamWriter(f, Encoding.Default)) 22 { 23 sw.Write(i); 24 } 25 } 26 }
我使用多线程并发向同一个append数据。相信你应该知道接下来运行起来会发生什么!
是的,正如你所料,该文件正由另一个进程使用,因此该进程无法访问此文件。也许这个场景,就像你写应用程序运行日志,异常日志。如果你没使用任何插件或者组件,就只能直接向文件中append。这样的问题,是你不得不解决的。
这个时候就是队列出场的时候了。当然队列的组件有很多,.NET框架下也有自带的队列Queue,微软也有独立的队列组件MSQueue。Apache有其ActiveMQ,另外知名的消息队列还有Equeue,ZeroMQ等。消息队列的使用场景,大概包括解耦,提高峰值处理能力,送达和排序保证,缓冲等。
RabbitMQ是一个消息中间件,其主要的观点很简单:接受和转发消息。你可以把他想象成邮局,当你发送新建到邮递箱,你很确定邮递员最终将会把你的新建传递到你的收件人手中。我们使用邮递箱和邮递员来隐喻RabbitMQ。关于RabbitMQ和邮局之前的主要区别在于邮局处理纸质信件,而MQ存储和转发二进制数据-message。下面提到RabbitMQ的几个”行话“。
生产者意味着发送消息。一个发送消息的应用程序是一个生产者,我们称其为"P"。
队列queue意味着邮递箱。他存在于RabbitMQ当中.尽管消息在RabbitMQ和你的应用程序中”流通“,他们可以被仅存在一个队列当中。一个队列不受任何限制,他可以存储你想要存储的消息量,它本质上是一个无限的缓冲区。多个生产者可以向同一个队列发送消息,多个消费者可以尝试从同一个消息队列中接收数据。一个队列像下面这样,上面是它的队列名称。
消费者意味着接收,消费者是等待接收处理消息的应用程序。
最后的关系就如下图:
接下来,我将使用RabbitMQ来解决最开始的文件并发问题。也就是说为了避免文件并发,我们要将生产者所需append到文件中的内容存入到消息队列当中,然后取出队列中的message让消费者写入到文件当中。关于RabbitMQ的安装和配置请先看张善友老师的文章:http://www.cnblogs.com/shanyou/p/4067250.html ,写的特别详细。只不过历经数月RabbitMQ C#客户端方法上有略微的更新。
下面我将新建两个ConsoleApp应用程序。一个负责Receive,消费者,写文件。另一个Send,生产者,将所需写入的数据推到RabbitMQ当中。
Receive代码如下:
static void Main(string[] args) { var factory = new ConnectionFactory() { HostName = "127.0.0.1", UserName = "WuShuang", Password = "123456" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); WriteLog(message); }; channel.BasicConsume(queue: "hello", noAck: true, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } publicstaticvoid WriteLog(string i) { using (FileStream f = new FileStream(@"d:\\A.txt", FileMode.Append)) { using (StreamWriter sw = new StreamWriter(f, Encoding.Default)) { sw.Write(i + "\n"); } } }
Send代码如下:
static void Main(string[] args) { new Thread(write1).Start(); new Thread(write1).Start(); new Thread(write1).Start(); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } publicstaticvoid write1() { var factory = new ConnectionFactory() { HostName = "127.0.0.1", UserName = "WuShuang", Password = "123456" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); channel.QueueBind("hello", "wsExchange", "hello"); for (int i = 0; i < 10000; i++) { string message = "Hello World ws!" + i; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "wsExchange", routingKey: "hello", basicProperties: null, body: body); Console.WriteLine(" [x] Sent {0}", message); } } //Console.ReadKey(); }
有了代码后,首先把Receive项目运行起来。等待生产者Send消息到队列中,然后Receive订阅的事件将会取出消息,并将消息写入到文件当中。
左侧的ConsoleApp持续向队列中写入消息,右侧的Receive的ConsoleApp运行过程中,会不断写文件。生产者承受了多线程并发些数据,当然消费者有序的取出队列中的数据,也不会发生最开始的文件并发异常。
今天的分享就这么简单,关于RabbitMQ有待继续深入学习。
如果您觉得我的点滴分享,对您有点滴帮助,欢迎点赞,也为您自己的进步点赞!
参考文章:
张善友老师:Windows上安装RabbitMQ指南
RabbitMQ(开源)官方文档 Hello world
原文:http://www.cnblogs.com/tdws/p/5860668.html
内容总结
以上是互联网集市为您收集整理的.NET文件并发与RabbitMQ(初探RabbitMQ)全部内容,希望文章能够帮你解决.NET文件并发与RabbitMQ(初探RabbitMQ)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。