范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Dubbo3。0RPC调用集群容错策略之并行请求机制源码分析

  上一篇:Dubbo3.0 RPC调用集群容错策略广播机制源码分析使用场景
  并行调用服务提供者,只要有一个节点返回正确则返回(只适用于查询数据场景)。 源码分析/*  * Licensed to the Apache Software Foundation (ASF) under one or more  * contributor license agreements.  See the NOTICE file distributed with  * this work for additional information regarding copyright ownership.  * The ASF licenses this file to You under the Apache License, Version 2.0  * (the "License"); you may not use this file except in compliance with  * the License.  You may obtain a copy of the License at  *  *     http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package org.apache.dubbo.rpc.cluster.support;  import org.apache.dubbo.common.URL; import org.apache.dubbo.common.threadlocal.NamedInternalThreadFactory; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.cluster.Directory; import org.apache.dubbo.rpc.cluster.LoadBalance;  import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;  import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT; import static org.apache.dubbo.common.constants.CommonConstants.FORKS_KEY; import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY; import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_FORKS;  /**  * NOTICE! This implementation does not work well with async call.  * 

* Invoke a specific number of invokers concurrently, usually used for demanding real-time operations, but need to waste more service resources. * * Fork */ /** * 并行去调用几个服务实例,如果那个服务实例先返回结果了就用谁返回的结果 * 优点:可以快速返回结果,缺点:增加了CPU负载 * @param */ public class ForkingClusterInvoker extends AbstractClusterInvoker { /** * Use {@link NamedInternalThreadFactory} to produce {@link org.apache.dubbo.common.threadlocal.InternalThread} * which with the use of {@link org.apache.dubbo.common.threadlocal.InternalThreadLocal} in {@link RpcContext}. */ private final ExecutorService executor; public ForkingClusterInvoker(Directory directory) { super(directory); executor = directory.getUrl().getOrDefaultApplicationModel().getApplicationExecutorRepository().getSharedExecutor(); } @Override @SuppressWarnings({"unchecked", "rawtypes"}) public Result doInvoke(final Invocation invocation, List> invokers, LoadBalance loadbalance) throws RpcException { try { /** 检查invokers是否为空 */ checkInvokers(invokers, invocation); final List> selected; /** 并行度,默认:2 */ final int forks = getUrl().getParameter(FORKS_KEY, DEFAULT_FORKS); /** 超时时间:1000 */ final int timeout = getUrl().getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT); /** 判断并行度是否小于0或者大于invokers集合数量 */ if (forks <= 0 || forks >= invokers.size()) { /** * 如果满足条件,直接将invokers赋值给selected * 说明同时对所有目标服务实例发起调用 */ selected = invokers; } else { /** 根据并行度构建集合 */ selected = new ArrayList<>(forks); /** 循环直至selected集合达到并行度数量 */ while (selected.size() < forks) { /** 根据负载均衡策略选择一个Invoker */ Invoker invoker = select(loadbalance, invocation, invokers, selected); /** 判断是否已存在待调用的Invoker集合中,不存在则添加 */ if (!selected.contains(invoker)) { //Avoid add the same invoker several times. selected.add(invoker); } } } RpcContext.getServiceContext().setInvokers((List) selected); final AtomicInteger count = new AtomicInteger(); final BlockingQueue ref = new LinkedBlockingQueue<>(1); /** 遍历待调用的Invoker利用线程池发起调用 */ for (final Invoker invoker : selected) { URL consumerUrl = RpcContext.getServiceContext().getConsumerUrl(); /** 线程池调用 */ executor.execute(() -> { try { /** 判断ref队列大小是否大于0,大于0说明已经有服务实例返回结果了 */ if (ref.size() > 0) { return; } /** 执行rpc调用 */ Result result = invokeWithContextAsync(invoker, invocation, consumerUrl); /** 放入ref结果队列 */ ref.offer(result); } catch (Throwable e) { int value = count.incrementAndGet(); if (value >= selected.size()) { ref.offer(e); } } }); } try { /** 阻塞等待结果,最多等待一秒 */ Object ret = ref.poll(timeout, TimeUnit.MILLISECONDS); /** 如果为异常则重新封装之后抛出去 */ if (ret instanceof Throwable) { Throwable e = (Throwable) ret; throw new RpcException(e instanceof RpcException ? ((RpcException) e).getCode() : RpcException.UNKNOWN_EXCEPTION, "Failed to forking invoke provider " + selected + ", but no luck to perform the invocation. " + "Last error is: " + e.getMessage(), e.getCause() != null ? e.getCause() : e); } /** 返回结果 */ return (Result) ret; } catch (InterruptedException e) { throw new RpcException("Failed to forking invoke provider " + selected + ", " + "but no luck to perform the invocation. Last error is: " + e.getMessage(), e); } } finally { // clear attachments which is binding to current thread. RpcContext.getClientAttachment().clearAttachments(); } } }
iOS14。5正式版今日推送!这2种用户不需要升级图文创作打卡挑战活动今日凌晨,苹果对外正式发布iOS14。5正式版,这也是在经历了8个测试版和1个准正式RC版本之后,iOS迎来的整个iOS14中最大的版本更新!据了解,此次iOS印度人偷电有多疯狂?警察来了也没用,深扒印度人疯狂背后的辛酸中国与世界格格不入,他们仍使用维护成本极高的地下电缆!有印度人在社交平台上如此说道。好家伙,印度的电力系统有多脆弱人尽皆知,中国维护地下电缆反而跟世界不同了?难道一些印度人偷电还偷兵马俑都是单眼皮的未解之谜为什么兵马俑都是单眼皮??参观过兵马俑的人们总会被它的庞大细腻所折服,但你是否注意到这些沉默两千年的守护者个个都是单眼皮?关于兵马俑单眼皮这一现象,考古界也是争论颇多。后来经过反复低端便宜5G手机选择VIVOY51SVIVO最近上市一款低端5G手机,算得上是VIVO最便宜的5G手机吧!那么这款5G手机配置怎么样?值得入手吗?看看配置和价格的综合因素就清楚了。VIVOY51S一价格Y51s(6G9988最便宜865的折叠屏手机柔宇Flexpai2今天上午,柔宇科技正式发布了旗下第二款折叠屏手机FlexPai2。作为一款折叠屏手机,柔宇FlexPai2正面是一块7。8英寸19201440分辨率43的柔性屏,折叠后是5。5英寸写商业软文,让读者自愿为广告付钱,轻轻松松月入3万目前,各行各业都在疯狂内卷,自媒体行业更是如此,很多年轻人不想上班,过着朝九晚五的社畜生活,想靠自媒体谋生。当你去询问那些自媒体大佬,小白如何能够快速做好自媒体,他们的答案几乎无一鼠标终将消失,未来我们有哪些人机交互方式?资本实验室今日创新观察聚焦前沿科技创新与传统产业升级齐达在人类发明史上,诞生了无数的英雄。他们的发明往往从一项前沿技术到家喻户晓无处不在,但他们自己却又鲜为人知,美国发明家道格拉斯从硬件到服务,苹果公司如何应对未来发展压力资本实验室今日创新观察聚焦前沿科技创新与传统产业升级李鑫提到苹果公司,我们最先想到的极其炫丽的硬件产品,MacBookiPhoneiPad和iPod一系列数字产品则成就了苹果的今天真正的怡然自得自动驾驶改变未来旅游的8种方式资本实验室今日创新观察聚焦前沿科技创新与传统产业升级张珂直到现在,上车睡觉,下车拍照仍然是众多游客在跟团游中不良感受的真实写照。即使是自驾游,与之伴随的疲劳和诸多不便也是旅行过程中对号入座,看看未来几年机器人是否会取代你的工作资本实验室今日创新观察聚焦前沿科技创新与传统产业升级李鑫机器是否会取代人类的工作是当前讨论最多的话题之一。这主要源自于近几年以人工智能为代表的新技术的快速发展与商业化。尽管各研究机10月全球融资最多的22家创业公司资本实验室今日投资关注聚焦前沿科技创新与传统产业升级王进据CrunchBase统计数据显示,10月份,全球融资最多的22家创业公司融资总额达到64。69亿美元,平均融资额2。9亿美
L2级展开最后较量!城市领航辅助终于来了,哪家实力足够强?说起人机交互,似乎我们总能联想到科幻电影里的飞天车与太空船,就好比电影回到未来里马丁开着DMC12穿越到30年后(2015年),看见悬浮滑板飞行汽车自动驾驶等高新科技。回到现实世界520礼物推荐奇遇DreamProVR,用实力展现全能王者风范因为疫情常态化的大背景,去游乐场和影院的次数和时间越来越少,相对应的,家人看手机和平板等电子产品的时间越来越多,导致身体状态越来越差,娱乐的生活也是日益乏味。为了解决这个问题,加之免费在线的数据库建模工具,云版PownerDesignerTeamDesigner团队协作,一款免费在线的数据库表设计工具。类似PownerDesigner的功能,可用于设计mysql,oracle的表结构。支持私有化部署地址http10苹果公司的市值跌到全球第二,市值第一原来是一家石油公司截止5月11日美股收盘,苹果公司下跌5。18,蒸发近1300亿美元(折合人民币约8700亿元),市值为2。37万亿美元(折合人民币约16万亿元)。当日,在沙特利雅得证券交易所上市的中国联通正式升级发布银龄专享服务计划来源中国青年报客户端中国青年报客户端北京5月17日电(中青报中青网记者宁迪)5月17日,是一年一度的世界电信和信息社会日,国际电信联盟将本年度世界电信和信息社会日主题确定为面向老年微软计划将薪酬预算增加近一倍微软周一表示,它将其工资预算增加近一倍并将股票范围扩大至少25。因为它希望在与其他科技公司竞争人才的同时,奖励其应对通胀上升的劳动力。在彭博社获得的一份声明中,总部位于华盛顿雷德蒙抖音电商推出商家复产护航计划,九项举措助力商家复工复产5月15日,抖音电商启动商家复产护航计划,投入25亿流量补贴超2亿元消费券补贴,面向受疫情影响的商家,在政策扶持平台活动物流扶持客服专线四个方面推出九项帮扶举措,保障消费者权益和体蔚来没有退路,荣耀是它的胜利之路吗?如果不是那场蓄谋已久的阴谋,相信华为的手机业务板块,依旧会交出一份十分强势的成绩单。战略层面,华为本品牌主打高端,直面对抗苹果三星NOVA继续以明星代言人和线下扩张的路线,对抗OP荣耀X205G手机66W快充8GB128GB,作为老人机还是很不错随着手机科技的快速发展,手机更新换代时间也越来越快,有些曾经辉煌一时的5G手机,很多如今却被沦为老人机了。以前买的老人机往往标配的运行内存和机身内存都比较低,大部分的千元机运行内存国内手机出货量暴跌,荣耀首次登顶,华为的曙光已现昨天,中国信通院公布了今年第一季度国内手机市场的出货量数据,总体出货量为6934。6万部,同比下降29。2,暴跌近三成。在这样的行情下,却出现了一颗璀璨又耀眼的明星,那就是荣耀手机motoedgeS30冠军版体验报告全面出色的性价比王者谈起摩托罗拉,伴随着Hellomoto的开机铃声,成为了一代人的深刻记忆。如今,在竞争日益白热化的国产智能手机市场中,消费者在享受移动通信飞速发展便利的同时,对手机从设计硬件体验诸