一个winform带你玩转rabbitMQ(一)

干货 先上图 源码在系列结束后放出 大概2到3篇 本文从第三部分开始根据winform逐点展开



一. 安装部署

  下载 rabbitMQ :http://www.rabbitmq.com/download.html

  安装rabbitmq需要erlang,下载erlang:http://www.erlang.org/download.html

  按照官网按照步骤,例如windows http://www.rabbitmq.com/install-windows.html

  安装完rabbitMQ可以再启动插件扩展,其中包含了一个管理后台

  

  最新版本的后台地址为 http://localhost:15672/

  

  用户名和密码都为guest,输入完成进入主菜单

  

  功能很丰富,可以查看当前服务器的交换机,队列,消息,连接,会话等得使用情况。

  基本上到这里服务器的安装部署环节算是ok,很简单。



二.  简介

  要了解rabbitMQ 首先要了解AMQP协议 百科上给的很详细 http://baike.baidu.com/view/4023136.htm?fr=aladdin

  AMQP 有四个非常重要的概念:虚拟机(virtual host),通道(exchange),队列(queue)和绑定(binding)。

  虚拟机: 通常是应用的外在边界,我们可以为不同的虚拟机分配访问权限。虚拟机可持有多个交换机、队列和绑定。
  交换机: 从连接通道(Channel)接收消息,并按照特定的路由规则发送给队列。
  队列: 消息最终的存储容器,直到消费客户端(Consumer)将其取走。
  绑定: 也就是所谓的路由规则,告诉交换机将何种类型的消息发送到某个队列中。

  这个概念很重要 不然在学习rabbitmq的地方会碰到很多困难。想要进阶学习的可以参考 https://www.rabbitmq.com/tutorials/amqp-concepts.html

  借用官方一个图来阐述AMQP

  

  RabbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。

  你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ是一个邮箱、邮局、邮递员。RabbitMQ和邮局的主要区别是,它处理的不是纸,而是接收、存储和发送二进制的数据——消息。

  对于rabbitMQ本身的特点 参考官网 http://www.rabbitmq.com/features.html

  1、可靠性(Reliability)
  RabbitMQ提供很多特性供我们可以在性能和可靠性作出折中的选择,包括持久化、发送确认、发布者确认和高可用性等。
  2、弹性选路(Flexible Routing)
  消息在到达队列前通过交换(exchanges)来被选路。RabbitMQ为典型的选路逻辑设计了几个内置的交换类型。对于更加复杂的选路,我们可以将exchanges绑定在一起或者写属于自己的exchange类型插件。
  3、集群化(Clustering)
  在一个局域网内的几个RabbitMQ服务器可以集群起来,组成一个逻辑的代理人。
  4、联盟(Federation)
  对于那些需要比集群更加松散和非可靠连接的服务器来说,RabbitMQ提供一个联盟模型(Federation Model)
  5、高可用队列(High Available Queue)
  可以在一个集群里的几个机器里对队列做镜像,确保即时发生了硬件失效,你的消息也是安全的。
  6、多客户端(Many Clients)
  有各种语言的RabbitMQ客户端
  7、管理UI(Management UI)
  RabbitMQ提供一个易用的管理UI来监控和控制消息代理人的各个方面。
  8、跟踪(Tracing)
  如果你的消息系统行为异常,RabbitMQ提供跟踪支持来找出错误的根源。
  9、插件系统(Plugin System)
  RabbitMQ提供各种方式的插件扩展,我们可以实现自己的插件。

  使用任务队列一个优点是能够轻易地并行处理任务。当处理大量积压的任务,只要增加工作队列,通过这个方式,能够实现轻易的缩放。



三. 初探

  文中的winform所采取的client为官方的.net版本 https://github.com/rabbitmq/rabbitmq-dotnet-client

  首先是Connection和Channel的概念

  Connection 建立与rabbitmq server的一个连接,由ConnectionFactory创建,Channel建立在connection基础上的一个频道,相对于connection来说,它是轻量级的。可以理解成一次会话。

  代码示例 本机环境

                using (IConnection connection = factory.CreateConnection())
                {
                    using (IModel channel = connection.CreateModel())
                    {
			//do something
                    }
                }

  exchange有三种类型:

  Direct :处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。
  Fanout :不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
  Topic : 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。

  我们用winform分别造成三种类型的exchange来实际体验一下

  

  这里所谓的限定exchange是在我们安装rabbitmq server的时候自动生成的一些 我们的测试不使用这些exchange。

  然后我们新建3个Queue,这里我们会发现一个有趣的现象,rabbitmq server对于新生成的队列都会默认绑定在一个名称为“”的默认exchange上。

  先试试direct类型,下面我们分别把Q1,Q2,Q3根据路由key为空,k1,k.#绑定在dEx上(direct exchange)。
    

  然后我们根据路由key为空,k,k1,k2,k3来发送消息m1,m2,m3,m4,m5
    

  再用3个队列接收消息试一下结果
  

  因为发送确认标记ack,所以队列上读取过的消息会被删除,为了进一步认证,我在结尾又添加了一个routingkey为k.#的消息(对应绑定Q3),由图可见direct 模式下队列之收取他们完全对应的routingkey消息。

  下面我们再试一下fanout类型,把Q1,Q2,Q3根据路由key为空,k1,k.#绑定在fEx上(fanout exchange)。

  
  同上步骤建立绑定关系

  

  生产消息,然后看下队列接受消息的情况
  

  效果很明显,fanout为广播模式。

  再试试topic类型 把Q1,Q2,Q3根据路由key为空,k1,k.#绑定在tEx上(topic exchange)。

  

  推送消息
  

  接收消息
  
  通过3种模式 3个队列的消息读取 大家应该了解了这3中模式的区别。

  临时有约 本篇的内容相对较少 明天再继续详细讲一些api,发布订阅以及消费者集群等功能,希望对大家有帮助
  

  

时间: 2024-10-25 07:11:28

一个winform带你玩转rabbitMQ(一)的相关文章

一个winform带你玩转rabbitMQ(二)

接上一篇内容 安装,简介和初探 下面我们接着来学习下RabbitMQ 一.  exchange属性 Type 前一章我们说了exchange的类型分为fanout,direct,topic.还有一种不常用的headers. headers这种类型的exchange绑定的时候会忽略掉routingkey,Headers是一个键值对,可以定义成成字典等.发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息.匹配有两种方式all和any.这两

一个winform带你玩转rabbitMQ(三) 附源码

第一章. 安装,简介和初探 第二章. exchange,queue,binding介绍 订阅发布 工作队列(消费者集群) 本章收尾 介绍API CommandLine 以及其他功能 源码地址 https://github.com/dubing/MaoyaRabbit RabbitMQ API RabbitMQ Server提供了丰富的http api. 举个列子 需要HTTP基本身份验证.默认的用户名/密码为guest/guest. 这些返回值得意义我从官网搬来解释,为了避免翻译的问题导致大家理

带你玩转rabbitMQ 附源码

RabbitMQ API RabbitMQ Server提供了丰富的http api. 举个列子 需要HTTP基本身份验证.默认的用户名/密码为guest/guest. 这些返回值得意义我从官网搬来解释,为了避免翻译的问题导致大家理解的误差这里直接给出原文 cluster_name The name of the entire cluster, as set with rabbitmqctl set_cluster_name. erlang_full_version A string with

带你玩转Visual Studio——结局汇总

感谢 这一系列文章陆陆续续写了一个月,也差不多可以告一个段落了.感谢读者们一直以来对我关注和支持!现将这一系列文章在这做一个汇总,以方便大家查阅.若是初学者,建议按顺序阅读. 系列文章目录 带你玩转Visual Studio--开篇介绍 带你玩转Visual Studio--带你新建一个工程 带你玩转Visual Studio--带你了解VC++各种类型的工程 带你玩转Visual Studio--带你高效开发 带你玩转Visual Studio--带你高效管理代码 带你玩转Visual Stu

B - 瑶瑶带你玩激光坦克

B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submit Status Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射. 机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏. 瑶瑶想知道射一次激光最多可以攻击到多少个敌人.

带你玩转Kubernetes

导读 Kubernetes是著名的容器管理系统,是一个有这很多贡献者的开源大项目,它作为一个不挑食的容器管理框架,可以无处不在.这两天接触K8s,带你玩转K8s,这个教程可以大致让你知道运行更改源码,而且从头测试本地Kubernetes平台集群. Kubernetes是个有很多贡献者的开源大项目,理论上它作为一个不挑食的容器管理框架,可以无处不在.但可惜的是,无论实际编写还是贡献测试代码,引导kubernetes server都不太容易.里边的一些文件对于我来说有些乱,不是挂了的就是过时的.源文

带你玩转Visual Studio——带你高效管理代码

上一篇文章带你玩转Visual Studio--带你高效开发通过对VAssistX优秀插件的讲解,让我们掌握了快速开发C++代码的技能.然而大部分的程序都不是一个人的开发的,是由一个团队的多个人一起开发的,大型的系统还可能由多个不同的团队分包进行开发.多人进行协作开发时,代码的管理就显得及为重要,需要借助代码管理工具的辅助,这种工具又称为版本控制系统. 目前主流的版本控制系统有: CVS:是一个用于代码版本控制的自由软件,它是一个比较早出现的工具,由于它有很多自身的缺陷,现在几乎被SVN所取代了

带你玩转Visual Studio——带你发布自己的工程库

上一篇文章带你玩转Visual Studio--带你高效管理代码通过对VisualSVN优秀插件的讲解,让我们掌握了在集成开发环境VS中快捷高效地管理代码的技能.然而我们开发的程序并不总是直接地生成可执行的软件,我们可能只是开发某个大型系统的一个组件,也可能是开发某个软件的内核SDK提供给上层的应用程序调用,在开发的过程中我们也可能会用到第三方的开源库.那如果将自己的程序编译成程序库给调用方用呢?又如何在自己的程序中引用第三方库呢?这将是这篇文章要讲的内容--发布自己的工程库. 什么是程序库?

带你玩转Visual Studio——带你了解VC++各种类型的工程

上一篇文章带你玩转Visual Studio--带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途.由于这里包含的工程类型太多,有很多本人也没有接触过,有些可能理解的不太对的地方还请谅解. 图 1:New Project 理解几个概念 在开讲之前先大概理解几个概念,这是理解后面各种工程含义的基础. COM COM(Component Object Model)组件对象模型是microsoft制定的一个组件软件标准,跟unix上的CORB