构建易于维护的分布式程序

别再手动拼接口了!用Kettle的REST Client组件,5步搞定带Token认证的API数据抓取 本文详细介绍了如何利用Kettle的REST Client组件实现带Token认证的API数据自动化抓取。通过5个简单步骤,用户可以告别手动拼接口的低效操作,实现从Token获取到JSON数据解析的全流程自动化,显著提升数据采集效率和稳定性。 阅读详情

陈硕 (giantchen_AT_gmail)

Blog.youkuaiyun.com/Solstice

摘要:本篇博客没有新东西,只不过是把去年在珠三角技术沙龙做的一次演讲的其中一张 ppt 展开讲一讲。

本文标题中的“易于维护”指的是 supportability,不是 maintainability。前者是从运维人员角度说,程序管理起来很方便,日常的劳动负担小;后者是从开发人员的角度说,代码好读好改。

前文《分布式系统中的进程标识》我提到一个观点:分布式系统中的每个长期运行的、会与其他机器打交道的进程都应该提供一个管理接口,对外提供一个维修探查通道,可以查看进程的全部状态。一种具体的做法是在程序里内置 http 服务器。

embedhttp

今天展开谈一谈这么做的必要性。分成两个方面来说:1) 在服务程序内置监控接口的必要性;2) http 协议的便利性。

必要性

在程序中内置监控接口可以说是受了 Linux procfs 的启发。在 Linux 下,查看内核的状态不需要任何特殊的工具,只要用 ls 和 cat 在 /proc 目录下查看文件就行了。要知道当前系统中运行了哪些进程,每个进程都打开了哪些文件,进程的内存和 CPU 使用情况如何,每个进程启动了几个线程,当前有哪些 TCP 连接,每个网卡收发的字节数等等,都可以在 /proc 中找到答案。Linux Kernel 通过 procfs 这么一个探查接口把状态充分暴露出来,让监控操作系统的运行变得容易。

但是 procfs 也有两点明显的不足:

  • 它只能暴露 system-wide 的数据,不能查看每个进程内部的数据;
  • 它是本地文件系统,必须要登录到这台机器上才能查看,如果要管理有很多台机器,势必增加工作量。

对于第一点,举例来说,我想知道某个我们自己编写的服务进程的运行情况:

  • 到目前为止累计接受了多少个 TCP 连接
  • 当前有多少活动连接 (这个可以通过 procfs 查看)
  • 一共响应了多少次请求
  • 每次请求的平均输入输出数据长度是多少字节
  • 每次请求的平均响应时间是多少毫秒
  • 进程平均有多少个活动请求(并发请求)
  • 并发请求数的峰值是多少,出现在什么时候
  • 某个连接上平均有多少个活动请求
  • 进程中 XXXRequest 对象有多少份实例
  • 进程中打开了多少个数据库连接,每个连接的存活时间是多少
  • 程序中有一个 hashmap,保存了当前的活动请求,我想把它打印出来
  • 某个请求似乎卡在某个步骤了,我想打印进程中该请求的状态

这些正当需求只有通过程序主动暴露状态才能满足,否则,就算 ssh 登录到这台机器上,也看不到这些有用的进程内部信息。(总不能 gdb attach 吧?那就让服务进程暂停响应了。且不说 gdb 打印一个 hashmap 有多麻烦。)

便利性

如果程序要主动暴露内部状态,那么以哪种方式最为便利呢?当然是 http。http 的好处有:

  • 它是 TCP server,可以远程访问,不必登录到这台机器上
  • TCP server 的另一个好处是能安全方便地防止程序重复启动,这个已在前文有论述。
  • 最基本的 http 协议的实现起来很简单,不会给服务端程序带来多大负担,见 muduo::net::HttpServer 的例子
  • 不必使用特定的客户端程序,用普通 web 浏览器就能访问
  • 可以比较容易地用脚本语言实现客户端,便于自动化的状态收集与分析
  • http 是文本协议,紧急情况下在命令行用 telnet 甚至 wget 也能访问(比方说你在家通过 ssh 连到公司服务器解决某个线上问题,这时候没有 web 浏览器可用)
  • 借助 http URL 的路径,很容易实现有选择地查看一些信息,而不是把进程的全部状态一股脑儿 dump 出来,见 muduo::net::Inspector 的例子
  • http 天生支持聚合,一个浏览器页面可以内置多个 iframe,一眼就能看清多个进程的状态
  • 除了 GET method,如果有必要,还可以实现 PUT/POST/DELETE,通过 http 协议来控制并修改进程的状态,让程序“能观能控”(“能观”“能控”是自动控制领域的术语,这里借用一下)
  • 必要的时候还可以用 rest 的方式实现高级的聚合,见我在演讲中的“一种 REST 风格的监控”

另外,我们讨论分布式系统是运行在企业防火墙之内的基础设施,http 的安全性应该由防火墙保证。就好比你的 hadoop master 和 memcached 不会暴露给外网一样,在公司内部使用 http 只要没有人故意搞破坏就没事。

实例

演讲当时我举了 google 的例子:

google

当然,我们看不到 google 内部的服务器的状态页面究竟是什么样子,不过可以看看别的例子,比如 Hadoop。Hadoop 有四种主要 services:NameNode, DataNode, JobTracker, TaskTracker。每种 service 都内置了 http 状态页面,其默认 http 端口分别是:

  • NameNode 50070
  • DataNode  50075
  • JobTracker  50030
  • TaskTracker  50060

如果某台机器运行了 DataNode 和 TaskTracker,那么我们可以通过 http://hostname:50075 和 http://hostname:50060 来方便地查询其运行状态。

 

例外

如果不方便内置 http 服务,那么内置一个简单的 telnet 服务也不难,就像 memcached 的 stats 命令那样。

如果服务程序本身以 RPC 方式提供服务,那么可以不必内置 http 服务,而是增加一个 RFC 调用实现相同的功能。这个 RPC 可以命名为 admin(),输入的内容类似 url,返回的是该 url 对应的页面内容,可以是文本格式,也可以是 RPC 原生的打包格式。

总结

在自己编写分布式程序的时候,提供一个维修通道是很有必要的,它能帮助日常运维,而且在出现故障的时候帮助排查。相反,如果不在程序开发的时候统一预留这些维修通道,那么运维起来就抓瞎了——每个进程都是黑盒子,出点什么情况都得拼命查 log 试图恢复(猜测)进程的状态,工作效率极低。

使用rpcgen构建分布式程序的一个简单例子 使用rpcgen构建分布式程序的一个简单例子 一. RPC概念 1.1 介绍         在中间件的实现中,引入了远程过程调用RPC(Remote Procedure Call)的概念。同时,许多分布式系统是基于进程间的显式消息交换的,然而消息的发送和接收过程无法隐藏通信的存在,而通信的隐藏对于在分布式系统中实现访问透明性是极为重要的。因此这个问题在很长一段时间内都没有找到合适的 阅读详情

相关推荐

微信小程序登录状态维护-java后台

先上一张小程序官方的登录时序图(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html) 因为http是无状态的,所以维护登录状态的目的是为了标识,每一次请求是哪个用户发送过来的。 一般的javaweb开发在我们第一次访问页面时,java后台会自动生成一个会话ID保存在浏览器的cooki...

zwn888zwn的博客 1133

怎样才能“易于维护”?

这个标题是今天在 InfoQ 上看到的一篇文章,编辑同学又坏坏的在文章的最后提问“您的看法是什么呢?您认怎样的代码“易于维护”呢?”,一场讨论又开始了。呵呵,不过我还是很喜欢 InfoQ 的这个做法的——把国外各大论坛上讨论的一些有趣的话题整理翻译出来,尽可能呈现一些针锋相对的观点,让大家去进一步思考和讨论。这个做法比直接转载一些所谓的 砖家 的文章要更好,对正处于“启蒙阶段”的中国IT行业帮助更

jackei的测试生活 847

60、Java编程语言的程序维护

本文详细介绍了Java程序维护的各个方面,包括提升代码可维护性、使用版本控制工具如Git、日志记录工具如Log4j、性能监控与优化技巧、异常处理和调试方法、安全管理策略、依赖库更新、文档维护以及如何根据用户反馈改进程序。同时涵盖了面向对象编程的核心概念如类与对象、继承与多态、数据访问级别,并讨论了小程序部署、JAR文件打包、Java平台API使用、跨平台兼容性及程序调试与优化等实用技术。通过这些方法,可以确保Java程序在不同环境下的稳定性、安全性和高效运行。

jenkins8butler的博客 79

如何让项目中的代码更易于维护

http://www.cocoachina.com/programmer/20160823/17407.html

openglnewbee的博客 1465

Reactor模型:构建可组合的并发与分布式程序

本文深入探讨了并发和分布式编程中遇到的困难,并介绍了反应器(Reactors)模型如何解决这些问题。反应器模型借鉴了现有框架的最佳特性,如位置透明性、可序列化性和数据竞争自由,并特别强调了可组合性。文章通过实例展示了如何在不同平台上使用Reactors框架,并通过

weixin_28850145的博客 313

构建高性能Python分布式异步socket架构

分布式系统是由多个自治的计算机节点组成,这些节点通过通信网络协同工作,共同完成某项任务。与单机系统不同,分布式系统中的节点共享资源和信息,通过合作完成任务。分布式系统的主要特点包括:透明性:用户对分布式系统的操作应该像操作单机系统一样,无需关心系统的内部结构和物理位置。并发性:系统可以同时处理多个任务。可扩展性:系统可以通过增加更多的节点来提升计算能力和存储容量。可靠性:即使某个节点发生故障,系统也能继续运行。容错性。

weixin_42497762的博客 870

软件工程(软件维护之易维护性)

软件易维护性是指理解、改正、改动、改进软件的难易程度。通常影响软件易维护性的因素有易理解性、易测试性和易修改性 易维护性  是指维护人员为纠正软件系统出现的错误或缺陷,以及为满足新的要求而理解、修改和完善软件系统的难易程度。提高可维护性是决定软件工程方法论所有步骤的关键目标。1.易理解性易理解性被定义为人们通过阅读源代码和相关文档了解软件系统的结构、接口、功能、内部过程以及如何运行

Gabriel的专栏 6457

Frida精准定位Shopee x-sap-ri动态签名生成函数

x-sap-ri是Shopee客户端生成的上下文感知型动态令牌,本质为基于设备标识、请求路径与毫秒级时间戳三元组的SHA256哈希值,经Base64编码后作为防重放与防批量伪造的核心校验字段。其生成逻辑深度混淆且跨Java/Native层,静态分析失效,而Frida凭借内存级函数调用拦截与JNI层穿透能力,成为唯一可行的技术路径。本文聚焦Frida在加固App中的实战适配——通过libcrypto.so API特征扫描反向定位被抹名的生成函数,实现对x-sap-ri输入参数(如16字节device_id加密

weixin_33978578的博客 610

深入jvm笔记-虚拟机概述

平台无关                 平台无关性对于减化了移植大量工作。 Jini技术能够通过网络能够彼此交换对象。 java平台无关性减少部署应用程序成本。   网络特性                 java体系可以架构易于扩展和维护的分布式结构。     java虚拟机定义           抽象规范  仅仅是一个概念         一个具体实现 来自多...

xzc520 129

01. VBA从入门到精通——录制宏、窗口、快捷键

excel表功能区右击→常用→选择显示开发工具选项→确定Visual Basic:打开VBA窗口宏:查看要录制的宏录制宏:准备录制宏使用相对引用:录制宏的时候对单元格的引用做一个设置宏安全性:对宏的使用做安全设置,一般设置为禁用所有宏,并发出通知,此时打开带有宏代码的工作薄时会出现警告标记,如果宏可信就选择启动。

weixin_43812198的博客 1696

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1685

Jenkins分布式构建

Jenkins分布式构建(Jenkins Distributed builds) 前言: 当自动化测试用例需要在多个PC机或虚拟机中执行时,如果在每个虚拟机中均搭建类似tomcat+jenkins的环境,将会造成例如每台虚拟机资源占用大、对环境的配置维护成本大等弊端,此时,就可以采用Jenkins分布式构建方式了。 一、Jenkins节点配置 1.Master配置 1)进入Maste

hunterno4的专栏 2万+

瑞芯微RK3588开发板VSCode远程开发全攻略:从SSH配置到插件优化

本文详细介绍了如何在瑞芯微RK3588开发板上配置VSCode远程开发环境。从Ubuntu系统下的SSH服务设置、VSCode Remote-SSH扩展安装,到连接建立、基础工具链部署,再到针对ARM平台的性能优化与调试配置,提供了一套完整的实战指南,帮助开发者高效利用本地资源进行嵌入式开发。

weixin_28831341的博客 622

构建系统简介以及分布式Ninja实现原理

cloudbuild基于remoteapi实现了ninja的分布式构建,保留了原有Ninja的优点且能够快速的分布式编译大型项目,相比于单机显著缩短编译时间。

菜鸟能飞多高?~~~ 1919

从零开始:用君正T23ZN打造智能门锁双摄系统(含代码示例与调试技巧)

本文详细介绍了基于君正T23ZN视频处理芯片构建智能门锁双摄系统的完整实战方案。内容涵盖硬件选型与核心电路设计、软件开发环境搭建、双摄驱动框架、图像信号处理(ISP)调优、人脸识别算法集成与性能优化,以及系统调试与稳定性保障。文章提供了丰富的代码示例和调试技巧,旨在帮助嵌入式开发者高效实现具备人脸识别与监控功能的低功耗智能门锁视觉系统。

opencv7vision的博客 716

VT-Refine:基于仿真微调的视觉-触觉反馈双臂装配强化学习

本研究提出VT-Refine框架,通过融合真实世界示范、高保真触觉仿真与强化学习,解决高精度双臂装配任务。方法分为两阶段:首先利用少量人类示范数据预训练视觉-触觉扩散策略;随后在数字孪生仿真环境中进行强化学习微调。关键创新包括:开发GPU加速的触觉仿真模块精确模拟压阻式传感器;采用基于点云的多模态表征实现无缝的跨领域迁移。实验表明,该方法在五个双臂装配任务中显著提升性能,触觉反馈使成功率提高40%。研究首次实现仿真环境中的大规模双臂视觉-触觉强化学习及sim-to-real迁移,为接触密集型任务提供了新解决

2506_90492529的博客 1797

解锁云原生领域Jenkins的分布式构建能力

在现代软件开发中,持续集成和持续交付(CI/CD)已成为不可或缺的实践。Jenkins作为最流行的开源自动化服务器,其分布式构建能力能够显著提高构建效率。然而,在云原生环境中,传统的Jenkins部署方式面临诸多挑战。本文旨在提供一套完整的解决方案,帮助开发者在云原生架构中充分释放Jenkins的分布式构建潜力。介绍Jenkins分布式构建的基本概念探讨云原生环境带来的机遇和挑战详细讲解Kubernetes与Jenkins的集成方案提供性能优化和安全加固的最佳实践。

AI天才研究院 784

Python 爬虫实战:爬取微博热搜与用户评论数据

本文系统讲解微博热搜榜单与用户评论数据的爬取技术方案。针对微博热搜榜采用Requests+BeautifulSoup解析静态HTML结构,实现高效爬取;对于动态加载的评论数据,使用Selenium模拟浏览器行为规避反爬机制。详细阐述技术选型、反爬策略、数据清洗及存储方法,提供完整代码实现和输出示例。同时强调合规要求,提示开发者需在遵守平台规则的前提下进行数据采集。该方案为舆情分析和热点研究提供了可落地的技术实现路径。

2503_91057718的博客 1716

OoderAgent 4.0实战:构建可自主维护的分布式AI Agent调度网络

在软件工程与人工智能交叉领域,分布式系统架构是支撑复杂应用的核心。其核心原理在于通过解耦、通信和协调机制,将单体应用拆分为多个可独立部署和扩展的服务,以实现更高的可靠性、可扩展性和可维护性。这一技术价值在AI Agent场景下尤为凸显,它使得多个专精的智能体能够协同工作,共同完成编码、测试、审查等复杂任务,从而将AI能力从单点工具升级为系统化的生产力。应用场景广泛覆盖自动化代码生成、智能运维、多智能体协作平台等。本文聚焦于如何基于OoderAgent 4.0与事件驱动架构,构建一个具备**技能(Skills

weixin_42526101的博客 284

MTK(基础篇)ROM烧录以及分区的作用

本文介绍了MTK芯片设备的刷机流程及关键分区功能。首先通过MTK烧录工具加载ROM文件(包括引导文件和分区表),重点解析了各分区的核心作用:preloader类似BIOS负责硬件初始化;lk作为二级引导程序加载内核;vbmeta验证系统完整性;boot包含Linux内核;dtbo调整硬件配置;modem管理通信功能;tee保护生物识别数据;system/vendor分别存放系统核心和硬件驱动。特别指出preloader、vbmeta等关键分区损坏会导致设备变砖,而recovery分区是重要的救砖入口。全文简

weixin_49303682的博客 444

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Jenkins分布式实现: 构建弹性和可扩展的CI/CD环境

Jenkins是一个流行的开源持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)工具,它通过自动化构建、测试和部署过程,帮助开发团队更高效地交付软件。Jenkins的分布式实现允许将任务分散到多个计算机上执行,从而提高系统的弹性和可扩展性。本文将深入探讨Jenkins分布式架构的原理、设置方法以及相关的最佳实践。

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 1169

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

如何构建一个分布式爬虫:理论篇

前言 本系列文章计划分三个章节进行讲述,分别是理论篇、基础篇和实战篇。理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较完整且足够健壮的分布式微博爬虫。通过这三篇文章,希望大家能掌握如何构建一个分布式爬虫的方法;能举一反三,将celery用于除爬虫外的其它场景。目前基本上的博客都是教大家使用或者构建分布式爬虫,本系列...

Python零基础学习 265

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 分布式系统中的进程标识
下一篇: 一种自动反射消息类型的 Google Protobuf 网络传输方案
陈硕
博客等级 码龄26年 1万+粉丝 144原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值