rust的axux框架开启负载均衡和重启自身的方法-会议签到的调优

news2024/12/18 17:26:35

开启负载均衡和重启自身

  • 更换axum后台的意外
  • 解决的尝试
    • 在caddy反代,使用负载均衡,加多一个节点
    • axum主程序 ip映射信息做全局共享
    • axum重启自身刷新全局共享配置

前期刚实现了rust的后台关键业务.结果出现了两类大问题停止服务.在正用着的时候,出现很多意外,真是刺激…

更换axum后台的意外

1, ip2sta的配置没有在原flask服务重启后,没有导入到redis,导致rust后台无法取到,修改原flask初始redis的代码才解决, 停服一天,
2,rust服务,工作进程被我误退出了,结果所有的地点无法访问签到. 停服一天.
3,开启12小时观察到的,新的rust所在主机,没有使用东8区, 只是8点前无法使用业务数据.修改时区,未再造成停服.
下面说下负载均衡和动态监测可以解决这个问题,同时,

解决的尝试

在caddy反代,使用负载均衡,加多一个节点

更新了Caddyfile文件的handle_path改为handle,避免了一次无用的rewrite.

   redir /ck/test  /rk/test/0

    handle  /rk/*   {
   # handle_path /rk/* 
  # rewrite * /rk{path}
    reverse_proxy  {
        	header_up Host {host}
	       	header_up X-Real-IP {remote}
            health_uri /
            health_interval 5s
            health_timeout 1s
            to  10.180.133.35:6055  192.168.11.179:3001
}
    }
   

目测现在有两处提供服务,并且在一处断开后,只使用能用的那个.

axum主程序 ip映射信息做全局共享

上个文章

Android后端签到flask迁移到rust的axum的过程-签到性能和便携 ,ip2sta,加载到axum的启动配置.这样不要每次redis取值.

/**
 * 连接connection_redis
 */
fn connection_redis() -> redis::RedisResult<Connection> {
    let client = redis::Client::open(REDURL)?;
    let con = client.get_connection()?;
    Ok(con)
}
 
fn init_app_config() -> HashMap<String, String> {
    let mut con = connection_redis().ok().unwrap();
    // 测试是否成功连接Reids
    let keys:Vec<String>= con.hkeys("ip2sta" ).ok().unwrap();
     let mut map=HashMap::new(); 
     for i in keys{
        let v:String= con.hget("ip2sta", &i).ok().unwrap();
   
        map.insert(i,v); 
     }
   
   
     map
}
lazy_static! {
    static ref IP2STA: HashMap<String,String> = init_app_config(); }
#[tokio::main]
async fn main() {

在main主任务启动以前加载一次.就可以如下使用

  .route("/rk/test/",get(somehandle))
  .......
async fn somehandle(){
match  IP2STA.get(&cip) {
        Some(sta)=>  pobsta( State(pool.clone()),formatted,sta,person).await ,
        None => Ok(Html(format!("请联系管理员{:?}未设置~!",&cip))),
       
    }

这造成一个问题,ip2sta无法使用最新的数据.
虽然很久不会更新这个底层数据,但是手动重启不是合适的风格.必须要能让后台自动加载新信息…

axum重启自身刷新全局共享配置

https://zhuanlan.zhihu.com/p/649783802
Axum笔记:配置管理
这里提供了很多刷新的方式,其中state的方式已经被pool占有,lazy_static!是本文用的,剩下的我不理解,
下面是我提供的刷新方式,重启自身
在某个handle启动一个新spawn,即调用如下函数.


use tokio::time::{sleep, Duration}; 
use std::{process,env};

async  fn restartme(){
    let delay = Duration::from_millis(50);
 
    // 在延时后启动新进程
    tokio::spawn(async move {
        // 等待延时
        sleep(delay).await;
           // 获取程序自身的路径
      let me = env::current_exe().expect("Failed to get current exe path");
 
      // 重启程序
      let status = process::Command::new(me).spawn();
   
      match status {
          Ok(_child) => {
              // 如果成功,则退出当前实例
              std::process::exit(0);
          }
          Err(e) => {
              // 如果重启失败,打印错误并退出
              println!("Failed to restart: {}", e);
              std::process::exit(1);
          }
      }
    });
}

这样并不容易,因为当前process肯定占有了tcp端口. 所有子线程的成功判断,应该在tcp还未开始时.而且必须在父线程必须释放端口后再打开,可能tokia的axum 使用了,等待重试,和恰好的判断时机,让程序也就是web服务自己完成了配置加载和重启自身.
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring源码分析之BeanFactory接口的解析

前言: 在我们的前两篇文章当中我们看完之后其实我们都会发现当我们进行相关的重要的行为的时候如我们看到的GetBean或者在Register方法的时候会出现BeanFactroy进行调用那么这个时候我们就会产生一个疑惑这个到底是什么为什么这么重要,在我没有说的时候我们从字面上进行一个简单…

【zlm】 webrtc源码讲解三(总结)

目录 setsdp onwrite ​编辑 play 参考 setsdp onwrite play 参考 【zlm】 webrtc源码讲解_zlm webrtc-CSDN博客 【zlm】 webrtc源码讲解&#xff08;二&#xff09;_webrtc 源码-CSDN博客

电子应用设计方案-56:智能书柜系统方案设计

智能书柜系统方案设计 一、引言 随着数字化时代的发展和人们对知识获取的需求增加&#xff0c;智能书柜作为一种创新的图书管理和存储解决方案&#xff0c;能够提供更高效、便捷和个性化的服务。本方案旨在设计一款功能齐全、智能化程度高的智能书柜系统。 二、系统概述 1. 系…

Spring Boot 性能提升的核武器,速度提升 500%!

虚拟线程是 Java 21 引入的一个新特性&#xff0c;用于简化并发编程。它与传统的操作系统线程相比&#xff0c;具有显著的优势&#xff1a; 轻量级&#xff1a;虚拟线程由 JVM 管理&#xff0c;而非操作系统&#xff0c;因此它们的内存占用和创建成本远低于传统线程。理论上&am…

【5G】5G 无线协议 Radio Protocols(一)

长期演进&#xff08;LTE&#xff09;无线电协议主要设计用于通过扁平架构提供PS服务&#xff0c;相比之前的代际&#xff0c;这代表了一个重大改进&#xff0c;它消除了支持电路交换&#xff08;CS&#xff09;服务和复杂架构中固有的复杂性。许多原始的LTE原则自第8版以来一直…

实现按键按下(低电平)检测到下降沿

按照流程进行编程 步骤1&#xff1a; 初始化函数 包括时基工作参数配置 输入通道配置 更新中断使能 使能捕获、捕获中断及计数器 HAL_TIM_IC_Init(&ic_handle) //时基参数配置 HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2) //输…

2024广东省职业技能大赛云计算——私有云(OpenStack)平台搭建

OpenStack搭建 前言 搭建采用双节点安装&#xff0c;即controller控制节点和compute计算节点。 CentOS7 系统选择 2009 版本&#xff1a;CentOS-7-x86_64-DVD-2009.iso 可从阿里镜像站下载&#xff1a;https://mirrors.aliyun.com/centos/7/isos/x86_64/ OpenStack使用竞赛培…

使用ENSP实现NAT(2)

一、NAT的类型 二、静态NAT 1.项目拓扑 2.项目实现 路由器AR1配置&#xff1a; 进入系统视图 sys将路由器命名为AR1 sysname AR1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为192.168.10.254/24 ip address 192.168.10.254 24进…

RNN LSTM Seq2Seq Attention

非端到端&#xff1a; data -》 cleaning -》 feature Engining &#xff08;70%-80%工作 设计特征&#xff09;-》 分类器 -》预测 端到端 End-to-End&#xff1a; data -》 cleaning -》Deep learning&#xff08;表示学习&#xff0c;从数据中学习特征&#xff09; -》…

PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环

效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…

Nginx主要知识点总结

1下载nginx 到nginx官网nginx: download下载nginx&#xff0c;然后解压压缩包 然后双击nginx.exe就可以启动nginx 2启动nginx 然后在浏览器的网址处输入localhost&#xff0c;进入如下页面说明nginx启动成功 3了解nginx的配置文件 4熟悉nginx的基本配置和常用操作 Nginx 常…

如何跟进项目

在跟进项目的过程中&#xff0c;我们需要通过清晰的沟通和高效的执行来确保目标按时达成。简单来说&#xff0c;“如何跟进项目”可归纳为&#xff1a;明确目标和交付物、建立高效沟通机制、持续监控进度与风险、灵活应对变更。尤其是“明确目标和交付物”这一点&#xff1a;当…

获取微信用户openid

附上开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 开发之前,准备事项 一个已认证过的服务号|基本信息配置js域名和网站授权域名配置最后确认当前账号网页授权功能是否开通,没有开通的无法获取到用户授权开发人…

【WRF工具】WRF 模型评估MET(Model Evaluation Tools)

WRF 模型评估MET&#xff08;Model Evaluation Tools&#xff09; METplus 简介WRF 模型评估工具 MET 的安装与使用步骤安装步骤使用步骤 参考 METplus 简介 METplus 是一个增强型的模型评估和验证框架&#xff0c;支持从短期预报&#xff08;如实时警报&#xff09;到长期气候…

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK

作者&#xff1a;杨兰馨&#xff08;楠瑆&#xff09; 背景 2024 年 10 月 22 日&#xff0c;华为正式发布了原生鸿蒙操作系统&#xff08;HarmonyOS NEXT&#xff09;。原生鸿蒙实现了系统底座全部自研&#xff0c;系统的流畅度、性能、安全特性等方面显著提升&#xff0c;也…

云计算HCIP-OpenStack04

书接上回&#xff1a; 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务&#xff0c;最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…

MyBatis-Plus 实用工具:SqlHelper

SqlHelper 是MyBatis-Plus的一款SQL 辅助工具类&#xff0c;提供了一些常用的方法&#xff0c;简便我们的操作&#xff0c;提高开发效率。文档 最常用的是SqlHelper.table(Obj.class) 返回的 TableInfo 对象通常包含以下常用方法&#xff1a; 1. getTableName() 获取表名。示例…

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…

QT6 Socket通讯封装(TCP/UDP)

为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图&#xff0c;界面还没优化&#xff0c;后续更新 废话不多说直接上教程 添加库 如果为qmake项目中&#xff0c;在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…

函数指针的作用

函数指针的主要作用&#xff0c;就是用来选择不同的调度函数&#xff0c;来满足特殊需求。它的优点&#xff0c;使程序设计更加灵活。缺点&#xff1a;初学者很难理解函数指针&#xff0c;从而引起程序的可读性不高。 1、使用函数指针选择调度函数 #include "stm32f10x.…