rabbitmq

【Docker】之安装 RabbitMQ 1、下载 RabbitMQ 镜像 下载最新版本的镜像: docker pull rabbitmq 更多版本的镜像可以访问 Docker 官网:https://hub.docker.com/_/rabbitmq?tab=tags 2、创建并运行 RabbitMQ 容器 启动命令: docker run -d -p 15672:15672 -p 5672:5672 \ -e RABBITMQ_DEFAULT_VHOST=my_vhost \ -e RABBITMQ_DEFAULT_USER=adm 阅读详情

1、点对点模式(一对一):主要就是一个生产者对应一个消费者;(服务端定义的队列)

2、工作队列模式:即一对多,一个生产者产生的数据可以被多个消费者消费,但各个消费者获取的数据是不一致的,应该消息都是经过一个队列中获取的;(服务端定义的队列)

3、发布订阅模式:引入了交换机exchange,生产者产生的数据发布到exchange中,exchange分发到不同的队列中,每一个队列里面的数据都是一模一样的,给多个消费者消费;

        对应exchange交换机中的fanout(扇形交换机)

        服务端发送消息时自动生成队列(千万别自己定义队列,否者客户端接受的消息不是广播的)

        客户端根据订阅的交换机(队列)接受消息

4、routing模式:在pub/sub的基础上引入了routingkey的概念,即exchange会按照routingkey把消息分发到不同的队列中,给不同的消费者使用;

        对应exchange交换机中的direct(直连交换机)        

        服务端定义路由

        客户端根据自己绑定的路由接受消息

5、topics模式:在routing模式的基础上对routingkey 加入了  *  和 #  的概念,*  代表 单字符串匹配,#  代表 多字符串匹配,如 key为 beijing.chaoyang.20200312 =>  *.*.*.20200312 或者 #.20200312 ;(对应exchange交换机中的topic(主题交换机) 客户端定义队列,客户端根据自己绑定的路由接受消息)

         对应exchange交换机中的direct(直连交换机)  

        服务端定义路由

        客户端根据自己绑定的路由(通配符)接受消息

6、RPC模式:针对生产者产生的数据,消费者消费后会给生产者一个反馈,即远程过程调用。(这个在代码中没有体现,请自行编码体验)

using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RabbitMqCommon
{
    public class ConnectionUtils
    {
        public static IConnection GetConnection()
        {
            var factory = new ConnectionFactory();
            //连接主机名
            factory.HostName = "localhost";
            //mqtt用户需要在控制台和web服务器中配置
            //连接用户名
            factory.UserName = "admin";
            //连接密码
            factory.Password = "123456";
            //连接端口
            factory.Port = 5672;
            return factory.CreateConnection();
        }
    }
}
using RabbitMQ.Client;
using RabbitMqCommon;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RabbitMqProduct
{
    public partial class FrmProduct : Form
    {
        public FrmProduct()
        {
            InitializeComponent();
        }

        /// <summary>
        /// rabbitmq工作队列
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSendPoint_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(rtbsend.Text))
            {
                try
                {
                    //需要创建一个ConnectionFactory,设置目标,由于是在本机,
                    //所以设置为localhost,如果RabbitMQ不在本机,
                    //只需要设置目标机器的IP地址或者机器名称即可
                    //  ,然后设置前面创建的用户名和密码。
                    //1.声明MessageQueue
                    //在Rabbit MQ中,无论是生产者发送消息还是消费者接受消息,都首先需要声明一个MessageQueue。这就存在一个问题,是生产者声明还是消费者声明呢?要解决这个问题,首先需要明确:
                    //a)消费者是无法订阅或者获取不存在的MessageQueue中信息。
                    //b)消息被Exchange接受以后,如果没有匹配的Queue,则会被丢弃。
                    var connection = ConnectionUtils.GetConnection();
                    #region 简单队列模式 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机,一个direct类型的交换机,routing_key为queue名称)
                    //创建一个发布消息的的通道
                    using (var channel = connection.CreateModel())
                    {
                        //创建一个名称为hello的消息队列
                        channel.QueueDeclare("hello", true, false, false, null);

                        //我目前没有看出来有什么区别 加没加这个 客户端接收消息也是一个接一个地接收数据
                        channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

                        //发送的数据内容
                        string message = rtbsend.Text;

                        //将发送的数据转成字节数组
                        var body = Encoding.UTF8.GetBytes(message);
                        //自定义一个消息头header
                        IBasicProperties basicProperties = channel.CreateBasicProperties();
                        IDictionary<string, object> dic = new Dictionary<string, object>();
                        dic.Add("param_code", "1234");
                        dic.Add("param_pass", "1234");
                        basicProperties.Headers = dic;
                        //basicProperties.DeliveryMode = 2;
                        //basicProperties.Persistent = false; 这个属性就是用来设置上面DeliveryMode的
                        //我们可以确认即使RabbitMQ重启,我们的task_queue队列也不会丢失。
                        //接下来,我们需要将IBasicProperties.SetPersistent设置为true,用来将我们的消息标示成持久化的。
                        //basicProperties.Persistent = true;
                        //开始传递
                        channel.BasicPublish("", "hello", basicProperties, body);
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        /// <summary>
        ///基于exchange的fanout的工作队列 扇形交换机(fanout) 
        ///总结:no routing 根据绑定的全路径发布消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFanout_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(rtbsend.Text))
            {
                try
                {
                    #region Publish/Subscribe 发布/订阅模式 Fanout
                    var connection = ConnectionUtils.GetConnection();
                    //创建一个发布消息的的通道
                    using (var channel = connection.CreateModel())
                    {
                        var exchangestr = "exchange_fanout";
                        //创建一个名称为hello的消息队列
                        channel.ExchangeDeclare(exchangestr, ExchangeType.Fanout, true, false, null);
                        //发送的数据内容
                        string message = rtbsend.Text;

                        //将发送的数据转成字节数组
                        var body = Encoding.UTF8.GetBytes(message);
                        //自定义一个消息头header
                        IBasicProperties basicProperties = channel.CreateBasicProperties();
                        IDictionary<string, object> dic = new Dictionary<string, object>();
                        dic.Add("param_code", "1234");
                        dic.Add("param_pass", "1234");
                        basicProperties.Headers = dic;
                        //开始传递
                        channel.BasicPublish(exchangestr, "", basicProperties, body);
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
        /// <summary>
        ///基于exchange的topic的工作队列 主题交换机(topic) 
        ///总结:根据绑定通配符routing的路径来发布消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExChange_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(rtbsend.Text))
            {
                var connection = ConnectionUtils.GetConnection();
                #region 涉及交换机的发送和接收 Topic类型 处理routingKey和bindingKey,支持通配符。# 匹配0或多个单词,* 匹配单个单词。 Topic主题模式可以实现 Publish/Subscribe发布订阅模式 和 Routing路由模式 的双重功能
                //创建一个发布消息的的通道
                using (var channel = connection.CreateModel())
                {
                    //声明交换机- channel.exchangeDeclare(交换机名字,交换机类型)
                    var exchangestr = "exchange_topic";
                    channel.ExchangeDeclare(exchangestr, ExchangeType.Topic);
                    IBasicProperties basicProperties = channel.CreateBasicProperties();
                    IDictionary<string, object> dic = new Dictionary<string, object>();
                    dic.Add("param_code", "1234topic");
                    dic.Add("param_pass", "1234topic");
                    basicProperties.Headers = dic;
                    basicProperties.DeliveryMode = 1;
                    for (int i = 0; i < 4; i++)
                    {
                        //发送消息的时候根据相关逻辑指定相应的routing key。
                        string routekey = string.Empty;
                        switch (i)
                        {
                            case 0:
                                routekey = "log.success";
                                break;
                            case 1:
                                routekey = "log.error";
                                break;
                            case 2:
                                routekey = "log.info";
                                break;
                            case 3:
                                routekey = "log.waring";
                                break;
                        }
                        //内容
                        string message = rtbsend.Text + i;
                        var body = Encoding.UTF8.GetBytes(message);
                        //开始传递
                        channel.BasicPublish(exchangestr, routekey, basicProperties, body);
                    }
                }
                #endregion
            }
        }

        /// <summary>
        ///  rabbitmq主题模式 对应exchange的direct(直连交换机)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDirect_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(rtbsend.Text))
            {
                var connection = ConnectionUtils.GetConnection();
                #region 涉及交换机的发送和接收 Topic类型 处理routingKey和bindingKey,支持通配符。# 匹配0或多个单词,* 匹配单个单词。 Topic主题模式可以实现 Publish/Subscribe发布订阅模式 和 Routing路由模式 的双重功能
                //创建一个发布消息的的通道
                using (var channel = connection.CreateModel())
                {
                    //声明交换机- channel.exchangeDeclare(交换机名字,交换机类型)
                    var exchangestr = "exchange_direct";
                    channel.ExchangeDeclare(exchangestr, ExchangeType.Direct, true, false, null);
                    IBasicProperties basicProperties = channel.CreateBasicProperties();
                    IDictionary<string, object> dic = new Dictionary<string, object>();
                    dic.Add("param_code", "1234direct");
                    dic.Add("param_pass", "1234direct");
                    basicProperties.Headers = dic;
                    basicProperties.DeliveryMode = 1;
                    for (int i = 0; i < 4; i++)
                    {
                        //发送消息的时候根据相关逻辑指定相应的routing key。
                        string routekey = string.Empty;
                        switch (i)
                        {
                            case 0:
                                routekey = "success";
                                break;
                            case 1:
                                routekey = "error";
                                break;
                            case 2:
                                routekey = "info";
                                break;
                            case 3:
                                routekey = "waring";
                                break;
                        }
                        //内容
                        string message = rtbsend.Text + i;
                        var body = Encoding.UTF8.GetBytes(message);
                        //开始传递
                        channel.BasicPublish(exchangestr, routekey, basicProperties, body);
                    }
                }
                #endregion
            }
        }
    }
}
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using RabbitMqCommon;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RabbitMqConsume
{
    public partial class FrmConsume : Form
    {
        public FrmConsume()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }

        /*
         在通配符模式下,RabbitMQ使用模糊匹配来决定把消息推送给哪个生产者。通配符有两个符号来匹配routingKey

*匹配一个字符 如:*.qq.com 可匹配 1.qq.com
#匹配一个或者多个字符。 如:*.qq.com 可匹配 1.qq.com或者1111.qq.com
其他的操作基本和routing模式一样。

header模式
header模式是把routingkey放到header中.取消掉了routingKey。并使用一个字典传递 K、V的方式来匹配。
比如同时要给用户发送邮件和短信,可直接通过header的键值对来匹配绑定的值,把消息传递给发短信和邮件的生产者.
             */

        private void Form1_Load(object sender, EventArgs e)
        {
        }
        /// <summary>
        /// 工作队列模式
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPointReceive_Click(object sender, EventArgs e)
        {
            try
            {
                //创建rabbitmq一个连接
                var connection = ConnectionUtils.GetConnection();
                #region 点对点模式接受到的消息
                //创建一个接受消息的通道
                var channel = connection.CreateModel();
                //创建一个名称为hello的消息队列 如果存在则不会创建
                channel.QueueDeclare("hello", true, false, false, null);
                var consumer = new EventingBasicConsumer(channel);
                channel.BasicConsume("hello", false, consumer);
                consumer.Received += (model, ea) =>
                {
                    var headers = ea.BasicProperties.Headers;
                    if (headers != null)
                    {
                        foreach (var item in headers)
                        {
                            this.rtbmsg.AppendText($"key:{item.Key},value:{Encoding.UTF8.GetString(item.Value as byte[])}\n");
                        }
                    }
                    var body = ea.Body.ToArray();
                    //内容
                    var message = Encoding.UTF8.GetString(body);

                    this.rtbmsg.AppendText(message + "\n");

                    //手动确认消息
                    channel.BasicAck(ea.DeliveryTag, false);
                };
                #endregion
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + ex.StackTrace.ToString());
            }
        }
        /// <summary>
        ///基于exchange的fanout的工作队列 扇形交换机(fanout) 
        ///总结:no routing 只要绑定该队列就接受服务端发布的消息
        ///注意:在扇形交换机中不需要设置自定义的队列 否则会造成和工作组
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFanoutReceive_Click(object sender, EventArgs e)
        {
            #region fanout多播模式,也称为Publish/Scribe模式   就是把交换机(Exchange)里的消息发送给所有绑定该交换机的队列,忽略routingKey。
            //type: ExchangeType.Fanout 需要先启动消费者 不然会有问题
            //Publish/Subscribe 发布/订阅模式 使用的exchange 交换机的模式 只有一个exchange 在接收消息的时候使用的是临时创建的队列
            //注意:不要这样使用 using(var connection = ConnectionUtils.GetConnection()) 这样跑完之后连连接对象都释放掉了 当然接受不到消息的
            //并不是所有优雅的代码都是这么写的 有的时候还是需要考虑下逻辑问题 该不该这样写 不要一根筋
            //有的时候可能点的快 突然一下子能接受到一条 或几条消息 不要这样写
            var connection = ConnectionUtils.GetConnection();
            //创建一个发布消息的的通道 通道不能释放 如果通道释放了 连临时队列都没有了
            var channel = connection.CreateModel();
            //扇形交换机 存放数据的队列 可以使用临时队列 但是那样的话就有可能导致消息没有了 不是持久化的消息

            var exchangestr = "exchange_fanout";
            var queueName = channel.QueueDeclare().QueueName;
            //声明交换机与交换机类型
            channel.ExchangeDeclare(exchange: exchangestr, type: ExchangeType.Fanout, true, false, null);
            //队列绑定交换机与路由key
            //队列绑定交换机-channel.queueBind(队列名, 交换机名, 路由key[广播消息设置为空串])
            //可以绑定多个 绑定完了之后 只要是想这个名称的交换机的队列中发送消息 
            //消费者只要是绑定多这个交换机的路由,那么这个队列里面就能接受到服务端发布的多个消息
            channel.QueueBind(queueName, exchangestr, "");

            //9、声明队列-channel.queueDeclare(名称,是否持久化,是否独占本连接,是否自动删除,附加参数)
            var consumer = new EventingBasicConsumer(channel);
            //消费方法,这些方法是由服务端主动PUSH消息过来,方法接收到消息后进行处理 
            //我将下面的处理方法设置成 不自动回复处理 可以使用channel.BasicAck 手动确认消息是否已经接收
            channel.BasicConsume(queueName, false, consumer);
            consumer.Received += (model, ea) =>
            {
                var headers = ea.BasicProperties.Headers;
                if (headers != null)
                {
                    foreach (var item in headers)
                    {
                        this.rtbmsg.AppendText($"key:{item.Key},value:{Encoding.UTF8.GetString(item.Value as byte[])}\n");
                    }
                }
                var body = ea.Body.ToArray();
                //内容
                var message = Encoding.UTF8.GetString(body);
                this.rtbmsg.AppendText($"Exchange:{ea.Exchange},DeliveryTag:{ea.DeliveryTag },RoutingKey:{ ea.RoutingKey},message:{ message}\n");
                //手动确认消息
                channel.BasicAck(ea.DeliveryTag, true);
            };
            #endregion
        }

        /// <summary>
        ///基于exchange的topic的工作队列 主题交换机(topic)
        ///总结:routing 根据绑定的routing的通配符匹配路径接受服务端发布的消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExchangeReceive_Click(object sender, EventArgs e)
        {
            #region 涉及交换机的接收 Topic
            //创建rabbitmq一个连接
            var connection = ConnectionUtils.GetConnection();

            //创建一个发布消息的的通道
            var channel = connection.CreateModel();

            //这个是存放消息的一个队列名称
            var exchangestr = "exchange_topic";
            var queueName = "queue_topic";

            //声明交换机与交换机类型
            channel.ExchangeDeclare(exchange: exchangestr, type: ExchangeType.Topic);
            //9、声明队列-channel.queueDeclare(名称,是否持久化,是否独占本连接,是否自动删除,附加参数)
            channel.QueueDeclare(queueName, true, false, false, null);
            //队列绑定交换机与路由key
            //队列绑定交换机-channel.queueBind(队列名, 交换机名, 路由key[广播消息设置为空串])
            //可以绑定多个 绑定完了之后 只要是想这个名称的交换机的队列中发送消息 
            //消费者只要是绑定多这个交换机的路由,那么这个队列里面就能接受到服务端发布的消息
            channel.QueueBind(queueName, exchangestr, "log.*");

            //要改变这种行为的话,我们可以在BasicQos方法中设置prefetchCount = 1。
            //这样会告诉RabbitMQ一次不要给同一个worker提供多于一条的信息。
            //话句话说,在一个工作者还没有处理完消息,并且返回确认标志之前,不要再给它调度新的消息。
            //取而代之,它会将消息调度给下一个不再繁忙的工作者。
            channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

            var consumer = new EventingBasicConsumer(channel);
            channel.BasicConsume(queueName, false, consumer);
            consumer.Received += (model, ea) =>
            {
                var headers = ea.BasicProperties.Headers;
                if (headers != null)
                {
                    try
                    {
                        foreach (var item in headers)
                        {
                            this.rtbmsg.AppendText($"key:{item.Key},value:{Encoding.UTF8.GetString(item.Value as byte[])}\n");
                        }

                        var body = ea.Body.ToArray();
                        //内容
                        var message = Encoding.UTF8.GetString(body);

                        this.rtbmsg.AppendText($"Exchange:{ea.Exchange},DeliveryTag:{ea.DeliveryTag },RoutingKey:{ ea.RoutingKey},message:{ message}\n");

                        //手动确认消息 
                        channel.BasicAck(ea.DeliveryTag, true);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message + ex.StackTrace.ToString());
                    }
                };
            };
            #endregion
        }

        /// <summary>
        ///  基于exchange的direct的工作队列 直连交换机(direct)
        ///  总结:routing 根据绑定的routing的名称(全路径)接受服务端发布的消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDirect_Click(object sender, EventArgs e)
        {
            #region 涉及交换机的接收 Direct
            //创建rabbitmq一个连接
            var connection = ConnectionUtils.GetConnection();

            //创建一个发布消息的的通道
            var channel = connection.CreateModel();

            //这个是存放消息的一个队列名称
            var exchangestr = "exchange_direct";
            var queueName = "queue_direct";

            //声明交换机与交换机类型
            channel.ExchangeDeclare(exchange: exchangestr, type: ExchangeType.Direct, true, false, null);
            //9、声明队列-channel.queueDeclare(名称,是否持久化,是否独占本连接,是否自动删除,附加参数)
            channel.QueueDeclare(queueName, true, false, false, null);
            //队列绑定交换机与路由key
            //队列绑定交换机-channel.queueBind(队列名, 交换机名, 路由key[广播消息设置为空串])
            //可以绑定多个 绑定完了之后 只要是想这个名称的交换机的队列中发送消息 
            //消费者只要是绑定多这个交换机的路由,那么这个队列里面就能接受到服务端发布的消息
            channel.QueueBind(queueName, exchangestr, "success");
            channel.QueueBind(queueName, exchangestr, "error");
            channel.QueueBind(queueName, exchangestr, "info");
            //channel.QueueBind(queueName, exchangestr, "waring");


            //要改变这种行为的话,我们可以在BasicQos方法中设置prefetchCount = 1。
            //这样会告诉RabbitMQ一次不要给同一个worker提供多于一条的信息。
            //话句话说,在一个工作者还没有处理完消息,并且返回确认标志之前,不要再给它调度新的消息。
            //取而代之,它会将消息调度给下一个不再繁忙的工作者。
            channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

            var consumer = new EventingBasicConsumer(channel);
            channel.BasicConsume(queueName, false, consumer);
            consumer.Received += (model, ea) =>
            {
                var headers = ea.BasicProperties.Headers;
                if (headers != null)
                {
                    try
                    {
                        foreach (var item in headers)
                        {
                            this.rtbmsg.AppendText($"key:{item.Key},value:{Encoding.UTF8.GetString(item.Value as byte[])}\n");
                        }

                        var body = ea.Body.ToArray();
                        //内容
                        var message = Encoding.UTF8.GetString(body);

                        this.rtbmsg.AppendText($"Exchange:{ea.Exchange},DeliveryTag:{ea.DeliveryTag },RoutingKey:{ ea.RoutingKey},message:{ message}\n");

                        //手动确认消息 
                        channel.BasicAck(ea.DeliveryTag, true);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message + ex.StackTrace.ToString());
                    }
                };
            };
            #endregion
        }
    }
}

代码仓库地址:https://gitee.com/javascripts/rabbitmq.git
rabbitmq中文文档直达车:http://rabbitmq.mr-ping.com

ERGM指数随机图模型全解析:从基础原理到R语言实操 从社交网络中的互惠、传递性和同质性等基本现象切入,介绍网络数据与传统回归分析的本质差异——边与边之间的依赖关系。指数随机图模型(ERGM)正是为刻画这种依赖结构而设计的统计框架,它通过指数族分布将网络结构效应显式建模,结合MCMC方法完成参数估计。ERGM在组织协作、传播扩散、生物生态等领域的应用日益广泛,其扩展模型TERGM、GERGM和多层ERGM进一步支持时序、权重与多重关系网络。本文系统梳理ERGM的理论基础、核心统计量、扩展模型选型及R语言实操要点,帮助研究者理解网络生成机制并完成收敛性诊断与结果 阅读详情

相关推荐

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

RabbitMQ发送消息附带BasicProperties属性详解

RabbitMQ发送消息附带BasicProperties属性详解 BasicPropertie属性字段详解 contentType:消息的内容类型,如:text/plain contentEncoding:消息内容编码 headers:设置消息的header,类型为Map<String,Object> deliveryMode:1(nopersistent)非持久化,2(persi...

OceanSky的专栏 9271

深入解析AXI-Stream协议中的TVALID与TREADY握手时序

本文深入解析AXI-Stream协议中TVALID与TREADY的握手时序,通过实际案例和代码示例详细说明三种典型握手场景及其应用。文章还探讨了常见握手失败案例的解决方法,并介绍了TLAST、TKEEP等高级信号的使用技巧,帮助开发者优化FPGA设计中的数据传输效率。

weixin_29200485的博客 341

RabbitMQ BasicProperties

简介 当使用RabbitMQ发布消息时,消息又AMQP规范中的三个低层帧类型组成: Basic.publish方法帧; 内容头帧; 消息体帧; 这三种帧类型按顺序一起工作,以便消息传递时完好无损。 其中,内容头帧中的消息属性是一种预定义的值,这些值通过设置Basic.Properties数据结构进行指定: content-type属性:让消费者知道如何解释消息体; content-encoding属性:指示消息体使用某种特殊的方式进行压缩或编码; message-id和correlati

江城宴的博客 2360

微波射频学习笔记18-------偶极子天线和微波天线设计介绍

几种天线设计方法的介绍 一、偶极子天线 1.天线模型 两根紧挨着的金属导体,长度均为四分之一波长,直径均远小于波长,两导体间距也远小于波长。 2.天线性能的设计因素 ① 单个导体长度L:(光速/频率)/4=四分之一波长(在空气中传播的波长),但在导体中传播,波长会变短; ② 导体半径R:远小于波长即可,使用导电率高些的材料,市面上常见直径零点几毫米就挺好,或者用波长/200,得出一个小200的值,也算远小于波长; ③ 两导体间距S:远小于波长即可,可以比半径更小点。 以上三个变量L、R、S,均可在仿真软件

Sil_sprout 1万+

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2474

万字长文:从 C# 入门学会 RabbitMQ 消息队列编程

RabbitMQ 是一个实现了 AMQP 协议的消息队列,AMQP 被定义为作为消息传递中间件的开放标准的应用层协议。它代表高级消息队列协议,具有消息定位、路由、队列、安全性和可靠性等特点。

寒冰屋的专栏 1126

VS2019集成AddressSanitizer:C++内存错误检测实战指南

在C++开发中,内存管理是核心挑战之一,涉及堆、栈和全局变量的分配与释放。其原理在于程序运行时对内存地址的访问必须严格遵循分配边界和生命周期规则,否则会导致缓冲区溢出、释放后使用等严重错误。这类问题的技术价值在于直接影响程序的稳定性、安全性和性能,是高质量软件必须攻克的基础难题。应用场景广泛,从嵌入式系统到大型服务器软件,都需要可靠的内存错误检测机制。AddressSanitizer(ASan)作为一种编译时插桩技术,通过影子内存和运行时检查,能精准定位堆缓冲区溢出、释放后使用等隐蔽错误。本文以Visual

weixin_34356310的博客 279

RabbitMQ随手笔记(九)RabbitMQ实现RPC(netCore2.0)

实现RPC用到了IBasicProperties的两个属性:1.replyto:通常用来设置一个回调队列2.correlationId:用来关联请求(request)和其调用RPC之后的回复(response)。Server代码using System; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; ...

wby90的博客 1452

AlphaFold3实战:用它预测抗体结构,我的CDR H3环RMSD降到了2Å以内

本文详细介绍了如何利用AlphaFold3(AF3)高精度预测抗体结构,特别是CDR H3环的建模,其RMSD可降至2Å以内。通过实战演示从序列输入到结构优化的全流程,包括参数配置、置信度指标解读及结果分析,帮助研究人员快速掌握AF3在抗体药物研发中的应用。

weixin_29224529的博客 187

AUTOSAR从入门到精通-【自动驾驶】特斯拉全自动驾驶(FSD)

特斯拉全自动驾驶系统(Full-Self Driving,简称FSD)是特斯拉公司开发的高级驾驶辅助系统,旨在通过神经网络技术实现环境感知与车辆控制,在驾驶员监督下完成导航、转向、变道、泊车等操作。‌ 该系统自2021年发布Beta测试版以来持续迭代,最新版本为2025年10月推出的v14版本。‌FSD v14版本基于端到端神经网络架构,取代了传统代码逻辑,通过数百万视频片段训练模型,以模仿人类驾驶决策。‌ 其功能覆盖住宅区街道、城市道路及高速公路,支持交通信号识别、自动变道和环岛通行等场景。

getusushu的博客 570

.net使用RabbitMQ小记

命名空间引用连接到RabbitMQ打开一个通道断开连接关闭连接后,通道也会自动释放掉connection 是一个长连接,底层协议针对长连接做了优化,这意味着打开一个新的连接将会有巨大的开销。channel 也是长连接,新建通道的开销会小很多,一般情况下,建议通道也复用,不要重复新建。设置客户端名称(方便识别多个客户端,强烈建议设置)定义交换机和队列,并绑定直接删除删除队列,如果为空删除队列,如果没有使用(没有任何消费者)删除队列并清除消息。

yunxiaobaobei的博客 754

【护网必备】Windows平台shellcode免杀加载器

bypass:McAfee、金山(数字签名)、火绒、ESET、卡巴企业版(时间5s 抖动50 Sleep_mask)、360全家桶(物理机)、Norton(加白程序资源)、WDF(PC)、WDF(Server)、Symantec(加白程序资源)bypass:金山(数字签名)、火绒、ESET、360全家桶(物理机)、WDF(PC)、WDF(服务器提示复查(关云保护))、McAfee、Norton(加白程序资源)、卡巴企业版(时间5s 抖动50 Sleep_mask)必须使用Bof操作,shell运行就掉线。

Fly_鹏程万里 1186

win10 安装RabbitMQ时 执行:rabbitmq-plugins enable rabbitmq_management命令报 Plugin configuration unchanged

安装RabbitMQ时 执行:rabbitmq-plugins enable rabbitmq_management命令报 Plugin configuration unchanged

xin292930540的专栏 6601

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【RabbitMQ】Windows下RabbitMQ的安装和部署

RabbitMQ在windows下安装部署

Hanson的博客 4082

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RabbitMQ 集群

RabbitMQ集群

不能再留遗憾了的博客 3854

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RabbitMQ学习笔记:节点名称详解、rabbitmq-server、及rabbitmq-env.conf

rabbitmq-server rabbitmq-server 启动一个RabbitMQ节点 1.rabbitmq-server在前端启动一个RabbitMQ节点,示例如下: [root@rabbit3 rabbitmq]# rabbitmq-server ## ## RabbitMQ 3.8.1 ## ## ########## Copyright (c) 20...

OceanSky的专栏 1万+

【RabbitMQ实战】06 RabbitMQ配置

一般情况下,可以使用默认的内建配置来有效地运行RabbitMQ,并且大多数情况下也并不需要修改任何 RabbitMQ的配置。当然,为了更加有效地操控 RabbitMQ,也可以利用调节系统范围内的参数来达到定制化的需求。RabbitMQ提供了三种方式来定制化服务:(1)环境变量(Enviroment Variables )。RabbitMQ服务端参数可以通过环境变量进行配置,例如,节点名称、RabbitMQ配置文件的地址、节点内部通信端口等。(2)配置文件(Configuration File )

程序员笔记 2873

rabbitmq系列1——安装并使用rabbitmq

🔥本篇概览:详细讲解了安装并使用rabbitmq,并讲解了数据隔离而生的的virtualhost。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 2108

什么是RabbitMQ

同步通讯:就像打电话,需要实时响应。异步通信:就像发微信,不需要马上回复。两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发微信可以同时与多个人收发信息,但是往往响应会有延迟。学SpringCloud的时候,我们的Feign 其实就是同步通讯的,他其实有以下这几个缺点耦合度高:(每次有新的需求,都需要更改代码)性能下降:(消费者需要等待提供者响应,如果调用链过长,那么响应的时间等于每次调用的时间之和)资源浪费。

越努力越幸运的博客 2914

RabbitMQ——Docker搭建RabbitMQ集群

文章目录RabbitMQ——Docker搭建RabbitMQ集群1、普通集群的搭建1.1、普通集群架构介绍1.2、环境准备1.3、集群搭建2、镜像集群的搭建2.1、配置镜像集群的策略 RabbitMQ——Docker搭建RabbitMQ集群 集群模式介绍 RabbitMQ集群模式有两种:普通模式和镜像模式 普通模式:默认模式,多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构、交换器结构、交换器与队列绑定关系、vhost。消费者消费消

万里顾一程的博客 5835

RabbitMQ

二、RabbitMQ用户管理 2.1 逻辑结构 用户 虚拟主机 队列 2.2 用户管理 2.2.1 命令行用户管理 在linux中使用命令行创建用户 ## 进入到rabbit_mq的sbin目录 cd /usr/local/rabbitmq_server-3.7.0/sbin ## 新增用户 ./rabbitmqctl add_user ytao admin123 设置用户级别 ## 用户级别: ## 1.administrator 可以登录控制台、查看所有信息、可以对RabbitMQ进行管

qq_43587076的博客 3687

laravel + rabbitmq

一、安装laravel 两种方式 1. composer global require laravel/installer laravel new wendao 2. composer create-project --prefer-dist laravel/laravel wendao 二、安装rabbitmq 1. docker pull rabbitmq:management //拉取rabbitmq 镜像 //启动容器 2.docker run -d --nam

rockywish的博客 6827

RabbitMQ 菜鸟安装、RabbitMQ初接触 AMQP 安装、配置指南

RabbitMQ安装: RabbitMQ是基于Erlang的,所以首先必须配置Erlang环境. 安装Erlang 进入到Erlang官网:http://www.erlang.org 进行下载 安装有两种方式: 1.1.源码安装方式: mkdir erlang cd erlang wget http://www.erlang.org/download/otp_src_R15B.t

hepeng_8的专栏 2900

RabbitMQ的基本使用

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。 一、消息队列 1、MQ:Message Queue释义 服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信) 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端,称为延迟消息通讯(异步通信) 2、消息队列特点.

qq_54936371的博客 3106

RabbitMQ 入门

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。比较常见的MQ实现:ActiveMQRabbitMQRocketMQKafka追求可用性(当需要处理数据时,资源处于可用状态的程度):Kafka、 RocketMQ 、RabbitMQ追求可靠性:RabbitMQ、RocketMQ追求吞吐能力(十万级别的):RocketMQ、Kafka追求消息低延迟:RabbitMQ、Kafka。

Java小白的博客 致力分享每一天学到的知识 1967
上一篇: c# 调用 c++ dll 依赖库的问题
下一篇: C#递归删除文件中的所有文件
HttpCookie
博客等级 码龄14年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值