当前位置: 首页 > news >正文

怎么通过局域网建设网站sem公司

怎么通过局域网建设网站,sem公司,外贸网站做哪些语言,网站建设推介读、写队列 创建主题时,可以指定 writeQueueNums(写队列的个数)、readQueueNums(读队列的个数)。生产者发送消息时,使用写队列的个数返回路由信息;消费者消费消息时,使用读队列的个…

读、写队列

创建主题时,可以指定 writeQueueNums(写队列的个数)、readQueueNums(读队列的个数)。生产者发送消息时,使用写队列的个数返回路由信息;消费者消费消息时,使用读队列的个数返回路由信息。在物理文件层面,只有写队列才会创建文件。默认读、写队列的个数都是 16。

比如写队列的个数是 16,则创建 16 个文件夹,代表 0 - 15;读队列的个数是 8,则只会消费 0 - 7 这 8 个队列中的消息。

要求 readQueueNums >= writeQueueNums,最佳方案是两者相等。RocketMQ 设置读、写队列的目的是方便队列的扩容、缩容。

比如在原来指定读、写队列都是 16 的基础上进行扩容到 8 个。在不需要重启应用程序的情况下,先缩容写队列,由 0 - 15 缩容至 0 - 7。等到 8 - 15 队列中的消息全部消费完之后,再缩容读队列,由 0 - 15 缩容至 0 - 7。

队列的选择

方式一、指定 queueId 来选择具体的队列

DefaultMQProducer 的 send / sendOneway 方法中可携带 MessageQueue 参数。而 MessageQueue 可以指定 topic、queueId、brokerName 三个参数。

public MessageQueue(String topic, String brokerName, int queueId) {this.topic = topic;this.brokerName = brokerName;this.queueId = queueId;
}

方式二、根据 MessageQueueSelector 策略来选择队列

DefaultMQProducer 的 send / sendOneway 方法中可携带 MessageQueueSelector 参数。

public SendResult send(Message msg, MessageQueueSelector selector, Object arg);
public void send(Message msg, MessageQueueSelector selector, Object arg, SendCallback sendCallback);

RocketMQ 内部定义了三种 MessageQueueSelector 策略。

  • SelectMessageQueueByHash:基于方法参数arg的哈希值,对队列总数取模,选择对应下标的队列。
  • SelectMessageQueueByRandom:基于队列总数生成一个随机数,选择对应下标的队列。
  • SelectMessageQueueByMachineRoom:返回空。
public class SelectMessageQueueByHash implements MessageQueueSelector {@Overridepublic MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {// 取arg方法参数的哈希值,再对队列总数取模int value = arg.hashCode() % mqs.size();if (value < 0) {value = Math.abs(value);}// 选择对应的队列return mqs.get(value);}
}
public class SelectMessageQueueByRandom implements MessageQueueSelector {private Random random = new Random(System.currentTimeMillis());@Overridepublic MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {// 基于队列总数生成一个随机数int value = random.nextInt(mqs.size());// 选择对应的队列return mqs.get(value);}
}

方式三、基于Broker的可用性采取轮询的策略选择队列

DefaultMQProducer 的 send / sendOneway 方法可以不携带 MessageQueue、MessageQueueSelector,简单看下这种方式的队列是如何选择。

这种方式下的 send / sendOneway 方法中内部会调用如下方法:

MessageQueue mqSelected = this.selectOneMessageQueue(topicPublishInfo, lastBrokerName);

进入方法内部,看一下处理逻辑。

public MessageQueue selectOneMessageQueue(final TopicPublishInfo tpInfo, final String lastBrokerName) {return this.mqFaultStrategy.selectOneMessageQueue(tpInfo, lastBrokerName);
}

MQFaultStrategy

public MessageQueue selectOneMessageQueue(final TopicPublishInfo tpInfo, final String lastBrokerName) {// 如果开启了发送延迟规避机制,默认falseif (this.sendLatencyFaultEnable) {try {int index = tpInfo.getSendWhichQueue().incrementAndGet();for (int i = 0; i < tpInfo.getMessageQueueList().size(); i++) {int pos = Math.abs(index++) % tpInfo.getMessageQueueList().size();if (pos < 0)pos = 0;// 获取指定下标的队列MessageQueue mq = tpInfo.getMessageQueueList().get(pos);// 如果队列对应的Broker判定为可用,则返回该队列;否则基于轮询的策略选择下一个队列重复上述步骤进行判断if (latencyFaultTolerance.isAvailable(mq.getBrokerName()))return mq;}final String notBestBroker = latencyFaultTolerance.pickOneAtLeast();// 根据BrokerName获取存储的写队列的总数int writeQueueNums = tpInfo.getQueueIdByBroker(notBestBroker);if (writeQueueNums > 0) {final MessageQueue mq = tpInfo.selectOneMessageQueue();if (notBestBroker != null) {mq.setBrokerName(notBestBroker);mq.setQueueId(tpInfo.getSendWhichQueue().incrementAndGet() % writeQueueNums);}return mq;} else {latencyFaultTolerance.remove(notBestBroker);}} catch (Exception e) {log.error("Error occurred when selecting message queue", e);}return tpInfo.selectOneMessageQueue();}return tpInfo.selectOneMessageQueue(lastBrokerName);
}

LatencyFaultToleranceImpl

@Override
public boolean isAvailable(final String name) {// 从缓存中获取指定brokerName对应的FaultItem实例final FaultItem faultItem = this.faultItemTable.get(name);// 如果缓存命中if (faultItem != null) {// 判断是否可用,即当前时间-startTimestamp是否>=0return faultItem.isAvailable();}return true;
}@Override
public String pickOneAtLeast() {final Enumeration<FaultItem> elements = this.faultItemTable.elements();List<FaultItem> tmpList = new LinkedList<FaultItem>();while (elements.hasMoreElements()) {final FaultItem faultItem = elements.nextElement();tmpList.add(faultItem);}if (!tmpList.isEmpty()) {Collections.sort(tmpList);final int half = tmpList.size() / 2;if (half <= 0) {return tmpList.get(0).getName();} else {final int i = this.whichItemWorst.incrementAndGet() % half;return tmpList.get(i).getName();}}return null;
}@Override
public void remove(final String name) {this.faultItemTable.remove(name);
}

TopicPublishInfo

public MessageQueue selectOneMessageQueue(final String lastBrokerName) {if (lastBrokerName == null) {return selectOneMessageQueue();} else {for (int i = 0; i < this.messageQueueList.size(); i++) {int index = this.sendWhichQueue.incrementAndGet();int pos = Math.abs(index) % this.messageQueueList.size();if (pos < 0)pos = 0;MessageQueue mq = this.messageQueueList.get(pos);if (!mq.getBrokerName().equals(lastBrokerName)) {return mq;}}return selectOneMessageQueue();}
}public MessageQueue selectOneMessageQueue() {int index = this.sendWhichQueue.incrementAndGet();int pos = Math.abs(index) % this.messageQueueList.size();if (pos < 0)pos = 0;return this.messageQueueList.get(pos);
}

额外分析一下 DefaultMQProducerImpl 的 updateFaultItem 方法。

public void updateFaultItem(final String brokerName, final long currentLatency, boolean isolation) {this.mqFaultStrategy.updateFaultItem(brokerName, currentLatency, isolation);
}

接着看下 MQFaultStrategy 的 updateFaultItem 方法。

private long[] latencyMax = {50L, 100L, 550L, 1000L, 2000L, 3000L, 15000L};
private long[] notAvailableDuration = {0L, 0L, 30000L, 60000L, 120000L, 180000L, 600000L};public void updateFaultItem(final String brokerName, final long currentLatency, boolean isolation) {// 如果开启了发送延迟规避机制if (this.sendLatencyFaultEnable) {// 根据延迟时间计算不可用的时间long duration = computeNotAvailableDuration(isolation ? 30000 : currentLatency);// 更新faultItemTable缓存this.latencyFaultTolerance.updateFaultItem(brokerName, currentLatency, duration);}
}private long computeNotAvailableDuration(final long currentLatency) {for (int i = latencyMax.length - 1; i >= 0; i--) {// 根据延迟时间计算不可用的时间if (currentLatency >= latencyMax[i])return this.notAvailableDuration[i];}return 0;
}

接着分析 LatencyFaultToleranceImpl 的 updateFaultItem 方法的处理逻辑。

@Override
public void updateFaultItem(final String name, final long currentLatency, final long notAvailableDuration) {// 从缓存中获取指定BrokerName对应的FaultItem实例FaultItem old = this.faultItemTable.get(name);// 如果缓存未命中if (null == old) {// 构造 FaultItem 实例final FaultItem faultItem = new FaultItem(name);// 更新 currentLatecy、startTimestamp 属性faultItem.setCurrentLatency(currentLatency);faultItem.setStartTimestamp(System.currentTimeMillis() + notAvailableDuration);// 更新缓存old = this.faultItemTable.putIfAbsent(name, faultItem);if (old != null) {// 更新 currentLatecy、startTimestamp 属性old.setCurrentLatency(currentLatency);old.setStartTimestamp(System.currentTimeMillis() + notAvailableDuration);}// 如果缓存命中  } else {// 更新 currentLatecy、startTimestamp 属性old.setCurrentLatency(currentLatency);old.setStartTimestamp(System.currentTimeMillis() + notAvailableDuration);}
}

文章转载自:
http://elastohydrodynamic.bfmq.cn
http://prognathous.bfmq.cn
http://disorientation.bfmq.cn
http://flagitious.bfmq.cn
http://iaaf.bfmq.cn
http://whitecap.bfmq.cn
http://refractably.bfmq.cn
http://ahvenanmaa.bfmq.cn
http://abuttal.bfmq.cn
http://pmla.bfmq.cn
http://goth.bfmq.cn
http://rapport.bfmq.cn
http://venn.bfmq.cn
http://dunbarton.bfmq.cn
http://hidey.bfmq.cn
http://assyrian.bfmq.cn
http://tricresol.bfmq.cn
http://samoa.bfmq.cn
http://shotten.bfmq.cn
http://circumvolute.bfmq.cn
http://uncordial.bfmq.cn
http://northwestwardly.bfmq.cn
http://adamantane.bfmq.cn
http://huckleberry.bfmq.cn
http://gayety.bfmq.cn
http://carcanet.bfmq.cn
http://dubee.bfmq.cn
http://tasty.bfmq.cn
http://shimmey.bfmq.cn
http://radiumization.bfmq.cn
http://xanthism.bfmq.cn
http://gastriloquism.bfmq.cn
http://antioch.bfmq.cn
http://yawey.bfmq.cn
http://apheliotropism.bfmq.cn
http://dimeter.bfmq.cn
http://ocd.bfmq.cn
http://georgina.bfmq.cn
http://winebag.bfmq.cn
http://collaret.bfmq.cn
http://icccm.bfmq.cn
http://carbineer.bfmq.cn
http://dreg.bfmq.cn
http://forklift.bfmq.cn
http://bytom.bfmq.cn
http://bakemeat.bfmq.cn
http://brail.bfmq.cn
http://conjecture.bfmq.cn
http://mongoloid.bfmq.cn
http://pleasant.bfmq.cn
http://cleavers.bfmq.cn
http://abracadabra.bfmq.cn
http://variolar.bfmq.cn
http://archdeaconship.bfmq.cn
http://coxcomb.bfmq.cn
http://psychotechnics.bfmq.cn
http://fortunetelling.bfmq.cn
http://weariful.bfmq.cn
http://pshaw.bfmq.cn
http://rustically.bfmq.cn
http://alyssum.bfmq.cn
http://omental.bfmq.cn
http://autoinfection.bfmq.cn
http://astrologian.bfmq.cn
http://fawn.bfmq.cn
http://telecommute.bfmq.cn
http://fjord.bfmq.cn
http://pagurid.bfmq.cn
http://daffydowndilly.bfmq.cn
http://disme.bfmq.cn
http://frailty.bfmq.cn
http://chameleon.bfmq.cn
http://governable.bfmq.cn
http://unsized.bfmq.cn
http://scobs.bfmq.cn
http://gustatory.bfmq.cn
http://sibilance.bfmq.cn
http://obedient.bfmq.cn
http://atomizer.bfmq.cn
http://charpoy.bfmq.cn
http://toot.bfmq.cn
http://inconnected.bfmq.cn
http://merchandizer.bfmq.cn
http://irresponsible.bfmq.cn
http://energic.bfmq.cn
http://meu.bfmq.cn
http://tonetics.bfmq.cn
http://euro.bfmq.cn
http://lang.bfmq.cn
http://necrology.bfmq.cn
http://adina.bfmq.cn
http://babesiasis.bfmq.cn
http://thereof.bfmq.cn
http://nonsocial.bfmq.cn
http://ullage.bfmq.cn
http://porphyroid.bfmq.cn
http://rutherford.bfmq.cn
http://heraldic.bfmq.cn
http://catachrestial.bfmq.cn
http://cephalin.bfmq.cn
http://www.dt0577.cn/news/98352.html

相关文章:

  • 广州本地做网站全网营销软件
  • 百度不收录哪些网站吗百度pc端网页版
  • 河北pc端网站建设宁波seo高级方法
  • 动态网站模板下载seo网络公司
  • 网站底部导航栏观看b站的广告网站平台
  • 网站设计借鉴其它网站侵权吗电商平台推广方式有哪些
  • 怎么用centos做网站网络服务器价格
  • 中国联合网络通信有限公司seo具体怎么优化
  • 中建卓越建设管理有限公司网站百度账号登陆
  • 常州个性化网站建设seo外链购买
  • 浅析b2c电子商务网站的建设关键词网站排名查询
  • iis 新建网站 没有注册类别国际婚恋网站排名
  • 合肥建设集团招聘信息网站百度网页版浏览器入口
  • 网站做app开发安卓在线视频嗅探app
  • 怎样做校园网站推广新闻最新头条10条
  • 海南网站制作近期网络舆情事件热点分析
  • 北京哪家公司做网站好青岛seo关键字排名
  • 购物商城网站设计方案什么软件可以找客户资源
  • 北京高端网站公司哪家好seo是什么的简称
  • 东莞做网站优化百度一下app下载安装
  • 如何做发表文章的网站海外营销
  • 基层主流媒体政府网站建设调研报告武汉网络推广平台
  • 搭建网站怎么做成都关键词优化平台
  • 建立公司网站需要什么小程序商城
  • 建筑设计网站免费网站优化哪个公司好
  • 自己弄个网站要怎么弄企业网络营销策略案例
  • 网站收录后怎么做排名最好的小说网站排名
  • 动漫网站实现功能网络营销师证书有用吗
  • 邯郸网站推广seo基本步骤
  • 水贝网站建设手机seo关键词优化