首页编程messagequeue messagequeue 用的是什么数据结构

messagequeue messagequeue 用的是什么数据结构

编程之家2023-11-0293次浏览

大家好,今天我将为大家揭秘messagequeue和messagequeue 用的是什么数据结构的奥秘,希望我的分享能给你带来新的启发和知识。

messagequeue messagequeue 用的是什么数据结构

messagequeue 用的是什么数据结构

visit般指树型链表结构某节点内容进行访问函数取节点内容做某件事通算写具体函数内容

树型链表结构自顶始按照某种顺序顺藤摸瓜至某节点程称遍历:

void traverse(link h, void visit(link))

{

if(h== 0) return;

visit(h);

messagequeue messagequeue 用的是什么数据结构

traverse(h->l, visit);

traverse(h->r, visit);

}

前序遍历(非递归):

非递归基于栈函数与面递归函数功能相等

void traverse(link h, void visit(link))

messagequeue messagequeue 用的是什么数据结构

{

Stack s;

s.push(h);

while(!s.empty())

{

visit(h= s.pop());

if(h->l!= 0) s.push(h->l);

if(h->r!= 0) s.push(h->r);

}

}

层顺序遍历:

前序遍历基本数据结构栈转变队列转变使遍历转层顺序

void traverse(link h, void visit(link))

{

Queue q;

q.put(h);

while(!q.empty())

{

visit(h= q.get());

if(h->l!= 0) q.put(h->l);

if(h->r!= 0) q.put(h->r);

}

}

-

RocketMQ源码之selectOneMessageQueue选择队列

RocketMQ是通过MQFaultStrategy的selectOneMessageQueue方法来选择发送队列的

我们先来看下MQFaultStrategy中重要的属性

我们来看开启了延迟容错的逻辑:

selectOneMessageQueue选择队列的基本逻辑我们已经了解了,现在来具体看下LatencyFaultToleranceImpl是怎么来维护这些broker的可用性和延迟的呢?

主要属性faultItemTable和内部类FaultItem

顾名思义这是一个延迟对象List,key为broker,value为FaultItem,FaultItem中存储了该broker的name,延迟界别和延迟开始的时间。

判断队列可用性方法如下:

如果faultItem中不存在该broker,返回true,当存在时,还需判断isAvailable

如果延迟时间已过也返回true。

选择完队列后,执行发送步骤

我们可以看到这里计算了某个broker的发送时间,然后根据这个时间去更新FaultItem

这里根据延迟时间对比MQFaultStrategy中的延迟级别数组latencyMax不可用时长数组notAvailableDuration来将该broker加进faultItemTable中。

1.所有的broker延迟信息都会被记录

2.发送消息时会选择延迟最低的broker来发送,提高效率

3.broker延迟过高会自动减少它的消息分配,充分发挥所有服务器的能力

C#的MessageQueue消息队列是多线程的么

System.Messaging.Message[] messages= queue.GetAllMessages();

foreach(System.Messaging.Message message in messages)

{

//Do something with the message.

}

你也可以用GetMessageEnumerator2方法代替上面的MessageQueue.GetAllMessages方法。虽然这两个方法的用法类似,但GetMessageEnumerator2只能向前(forward-only)。对于非常庞大的队列,则应用使用这个方法,而不是 MessageQueue.GetAllMessages方法。

这是因为GetAllMessages方法领取所有消息,把它们保存在当地内存中;而GetMessageEnumerator2方法只领取当前消息在本地保存,在调用MoveNext时才领取下一条消息。下面这条语句举例说明了GetMessageEnumerator2方法的用法。这段代码检查队列中的每一条消息,再删除它。

MessageEnumerator enumerator= queue.GetMessageEnumerator2();

while(enumerator.MoveNext())

enumerator.RemoveCurrent();

不过没有你想要的想删哪条就删哪条的那个用法似乎。。。

-

如果你还想了解更多这方面的信息,记得收藏关注本站。

企业网站备案(企业网站怎么备案)如何免费建网站,如何快速免费建立自己的网站