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

长治一般做一个网站需要多少钱大家推荐永久免费的服务器

长治一般做一个网站需要多少钱,大家推荐永久免费的服务器,软件开发培训通知,谷歌网站地图在线生成文章目录 1. 处理连接超时和断开重连的原因2. 处理连接超时和断开重连的方法2.1 处理连接超时2.1.1 步骤一:配置连接超时时间2.1.2 步骤二:监听连接结果 2.2 处理断开重连2.2.1 步骤一:监听连接断开事件2.2.2 步骤二:实现重连逻辑…

文章目录

  • 1. 处理连接超时和断开重连的原因
  • 2. 处理连接超时和断开重连的方法
    • 2.1 处理连接超时
      • 2.1.1 步骤一:配置连接超时时间
      • 2.1.2 步骤二:监听连接结果
    • 2.2 处理断开重连
      • 2.2.1 步骤一:监听连接断开事件
      • 2.2.2 步骤二:实现重连逻辑
        • 指数退避策略
          • 1. 指数退避策略的概念
          • 2. 使用指数退避策略的原因
      • 2.2.3 可选步骤:使用心跳监测机制
  • 3. 代码
    • 3.1 客户端 TimeoutClient
    • 3.2 客户端的重连处理器 TimeoutHandler
    • 3.3 服务器
    • 3.4 测试方法
  • 4. 总结


1. 处理连接超时和断开重连的原因

在网络编程中,处理 连接超时断开重连 是非常必要的,主要有以下几点原因:

  • 应对网络不稳定的情景:网络中存在拥塞、信号干扰等问题,会导致连接超时或断开。若不处理,程序可能等待或中断,浪费资源、影响业务
  • 保证系统可用性:服务器负载过高或故障恢复时,可能无法及时响应连接请求或使连接断开。处理这些情况能 提高连接成功率,让系统尽快恢复运行
  • 提升用户体验:可避免用户长时间等待,保证业务连续性,避免因连接问题影响实时应用,增强用户对应用的好感。

2. 处理连接超时和断开重连的方法

2.1 处理连接超时

处理连接超时共有以下两步:

2.1.1 步骤一:配置连接超时时间

在客户端 Bootstrap 中配置连接超时参数,若超时则触发异常

// 5s 连接超时
option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)

2.1.2 步骤二:监听连接结果

给连接操作添加监听器,这个监听器负责 处理连接失败并触发重连

bootstrap.connect(/* host */, /* port */).addListener((ChannelFutureListener) f -> {if (!f.isSuccess()) {System.out.println("连接失败,尝试重连...");// 触发重连逻辑,之后的代码会展示}});

注:重连只是处理连接超时的一种手段,还可以通过提示用户“网络卡顿,无法连接到服务器”的方式来处理连接超时。

2.2 处理断开重连

处理断开重连也有关键的两步:

2.2.1 步骤一:监听连接断开事件

ChannelHandler 中监听 channelInactive 事件,触发重连

@Override
public void channelInactive(ChannelHandlerContext ctx) {System.out.println("连接断开,启动重连");// 触发重连逻辑,之后的代码会展示ctx.fireChannelInactive();
}

2.2.2 步骤二:实现重连逻辑

使用 指数退避策略 调度重连,避免频繁尝试。

/*** 执行重连操作*/
public static void reconnect() {// retries 表示当前重连次数,是一个私有成员字段,MAX_RETRIES 表示最大重连次数,是一个私有静态常量if (retries >= MAX_RETRIES) {System.out.println("重连次数已达上限,放弃连接");return;}// 下一次重试前需要等待的最大时间为 2 的 retries 次方 和 30 中的较小值int maxRetryDelay = Math.min(30, 1 << retries++);// 下一次重试前需要等待的时间为 [1, 最大等待时间) 区间中的一个随机值int retryDelay = maxRetryDelay == 1 ? 1 : ThreadLocalRandom.current().nextInt(1, maxRetryDelay);System.out.println("第" + retries + "次重试,等待" + retryDelay + "秒");Bootstrap bootstrap = TimeoutClient.getBootstrap();bootstrap.config().group().schedule(() -> {bootstrap.connect(TimeoutClient.HOST, TimeoutClient.PORT).addListener(TIMEOUT_RECONNECT_LISTENER);}, retryDelay, TimeUnit.SECONDS);
}
指数退避策略
1. 指数退避策略的概念

指数退避策略 (Exponential Backoff) 是一种在重试机制中常用的算法,用于 处理因资源竞争、网络故障等原因导致的操作失败。其核心思想是 在每次操作失败后,等待一段随机的时间再进行下一次尝试,并且这个等待时间会随着失败次数的增加而呈指数级增长
 
一般而言,指数退避策略的等待时间计算公式可以表示为: T = b a s e × 2 n × r a n d o m T = base \times 2^n \times random T=base×2n×random。其中:

  • T T T下一次重试前需要等待的时间
  • b a s e base base初始的基本等待时间
  • n n n当前重连的次数
  • r a n d o m random random一个介于 0 到 1 之间的随机数,引入随机数是为了 避免多个客户端在同一时刻重试,从而减少冲突的可能性
2. 使用指数退避策略的原因
  • 减少资源竞争:在生产环境中,多个客户端可能会同时尝试访问同一个资源。如果没有退避策略,这些客户端会在失败后立刻再次尝试,这会导致资源竞争加剧,使得更多的请求失败。而指数退避策略通过让客户端在失败后等待不同的时间再重试,分散了重试的时间点,降低了资源竞争的概率,提高了资源的利用率类似于 Redis 缓存雪崩 问题的 随机过期时间 解决方案。
  • 应对临时故障许多操作失败可能是由于临时的网络波动、服务器过载等原因引起的,这些问题通常会在短时间内自行解决。指数退避策略让客户端在每次失败后等待更长的时间再重试,给系统留出更多的时间来恢复正常,从而提高了重试成功的概率
  • 节省系统资源频繁的重试操作会消耗客户端和服务器的系统资源。使用指数退避策略可以 减少不必要的重试次数,降低系统资源的消耗,提高系统的性能和效率

2.2.3 可选步骤:使用心跳监测机制

客户端与服务器之间,可以使用心跳监测机制,从而判断它们之间建立的连接是否存活。如果存活,则无需任何操作;否则不存活,需要断开连接,并进行重连操作。使用心跳监测机制的方法可以参考 Netty——心跳监测机制。

3. 代码

3.1 客户端 TimeoutClient

/*** 有超时重连机制的客户端*/
public class TimeoutClient {public static final String HOST = "127.0.0.1";public static final int PORT = 8888;private static Bootstrap bootstrap;public static Bootstrap getBootstrap() {return bootstrap;}public static void main(String[] args) {final EventLoopGroup group = new NioEventLoopGroup();bootstrap = new Bootstrap().group(group).channel(NioSocketChannel.class)// 5s 连接超时.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new MsgDecoder()).addLast(new MsgEncoder()).addLast(new TimeoutHandler());}});Runtime.getRuntime().addShutdownHook(new Thread(group::shutdownGracefully));bootstrap.connect(HOST, PORT).addListener(TimeoutHandler.TIMEOUT_RECONNECT_LISTENER);}
}

3.2 客户端的重连处理器 TimeoutHandler

/*** 客户端的重连处理器*/
public class TimeoutHandler extends ChannelInboundHandlerAdapter {/*** 最大重连次数*/private static final int MAX_RETRIES = 5;/*** 当前重连次数*/private static int retries = 0;/*** 连接超时后进行重连的事件监听器*/public static final ChannelFutureListener TIMEOUT_RECONNECT_LISTENER = f -> {if (!f.isSuccess()) {System.out.println("连接失败,尝试重连...");reconnect();}};/*** 执行重连操作*/public static void reconnect() {if (retries >= MAX_RETRIES) {System.out.println("重连次数已达上限,放弃连接");return;}// 下一次重试前需要等待的最大时间为 2 的 retries 次方 和 30 中的较小值int maxRetryDelay = Math.min(30, 1 << retries++);// 下一次重试前需要等待的时间为 [1, 最大等待时间) 区间中的一个随机值int retryDelay = maxRetryDelay == 1 ? 1 : ThreadLocalRandom.current().nextInt(1, maxRetryDelay);System.out.println("第" + retries + "次重试,等待" + retryDelay + "秒");Bootstrap bootstrap = TimeoutClient.getBootstrap();bootstrap.config().group().schedule(() -> {bootstrap.connect(TimeoutClient.HOST, TimeoutClient.PORT).addListener(TIMEOUT_RECONNECT_LISTENER);}, retryDelay, TimeUnit.SECONDS);}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("连接断开,启动重连");reconnect();ctx.fireChannelInactive();}
}

3.3 服务器

服务器代码可以参考 Netty——心跳监测机制 中实现的 HeartbeatServer

3.4 测试方法

  • 测试断开重连的处理:启动服务器和客户端。对于以上实现的客户端,在与该服务器建立连接后不会主动发送数据,如果超过 3s,该服务器会判定客户端宕机,断开连接,然后就会在客户端中触发 channelInactive 事件,从而触发断开重连机制。
  • 测试连接超时的处理:不要启动服务器,只启动客户端,就可以看到客户端重试连接最多 5 次。在这 5 次之内,如果启动服务器,则可以正常建立连接。

4. 总结

通过处理连接超时和断开重连,可以提高系统的健壮性,提升用户体验。在重连时,可以使用指数退避策略来减少资源的竞争、节省系统资源。


文章转载自:

http://E6SZE7Zd.kdLdx.cn
http://bzOHQwn5.kdLdx.cn
http://rY10sE6O.kdLdx.cn
http://DsxS7jvS.kdLdx.cn
http://NeIfvO0W.kdLdx.cn
http://siQohX7I.kdLdx.cn
http://k7oVLRpy.kdLdx.cn
http://QV0Z0bz0.kdLdx.cn
http://tt8fHvLb.kdLdx.cn
http://tAF9g1SJ.kdLdx.cn
http://Z3O7NUZe.kdLdx.cn
http://hbcqYB92.kdLdx.cn
http://UarEveNZ.kdLdx.cn
http://5Ro8Ba7X.kdLdx.cn
http://YHENCxvD.kdLdx.cn
http://T9YpVDX3.kdLdx.cn
http://CpsNySVH.kdLdx.cn
http://y8G6r3yU.kdLdx.cn
http://kkvfKTsA.kdLdx.cn
http://HJk9rfxJ.kdLdx.cn
http://fTWuYq1e.kdLdx.cn
http://ncldwFsE.kdLdx.cn
http://wBP9Dx3a.kdLdx.cn
http://XL9FBAVZ.kdLdx.cn
http://lRosxAP0.kdLdx.cn
http://L1YoFY9w.kdLdx.cn
http://ajA6rr9W.kdLdx.cn
http://aflKqAEN.kdLdx.cn
http://v8QwE5ue.kdLdx.cn
http://w2UTfOgZ.kdLdx.cn
http://www.dtcms.com/wzjs/714254.html

相关文章:

  • 深圳松岗 网站建设建筑人才网站哪个比较好
  • 网站注销流程html5行业网站
  • 网站建设岗位是干什么的重庆网站建设是什么
  • 如何自己建网站织梦cms手机网站源码
  • 我的世界服务器如何做充钱网站建网站制作
  • 镇江网站优化哪家好有什么可以接单做的网站
  • wordpress 商城模板seo顾问是啥
  • 网络设计是干什么工作的seo站长工具是什么
  • 建站公司专业地址海淘直邮购物网站
  • 建个企业网站备案需要多长时间做网站推广哪个好
  • 专业的咨询行业网站制作弹幕播放器 wordpress
  • 网站建设推广安徽wordpress账号登录界面
  • 珠海网站建设设计团队网站怎么做
  • 广州哪个大学做网站制作好些的建设工程合同分类有哪些
  • 银川微信网站制作长沙网站优化厂家
  • 手机网站建设事项网站开发的后台开发工具
  • gta5中正在建设的网站做网站是要写代码的吗
  • 网站标题logo修改代码泉州做网站工作室
  • 塑料模板多少钱一平方海南seo
  • 做音乐网站网站建设的目的与意义是什么
  • 南京企业网站制作哪家好网站域名如何使用方法
  • 优惠券网站要怎么做玉石电商网站建设方案
  • 浏阳网站建设淄博铺无忧网络科技有限公司
  • 整站优化关键词推广低代码无代码开发平台
  • 做平台网站怎么做佛山做网站制作
  • 咸阳网站建设seo温州市网页制作项文静
  • 明星个人网站建设方案珠海互联网平台
  • 专做智能化施工的网站北京海淀区居家办公
  • 哈尔滨悦创网络科技网站开发wordpress会员收费注册
  • 网站门户设计新生活cms订货系统下载