求教:如何做下游 RPC 返回结果的业务监控

118 天前
 lvxiaomao

背景

目前代码不可避免的调用下游 rpc ,并拿到 response 做解析;

目前有想到的就是 2 种方式:

第一种,重复劳动 如果成功则解析结果;如果失败做监控打点;代码如下:

public List<Object> functionName(List<Long> ids) {
    if (CollectionUtils.isEmpty(ids)) {
    	return Collections.emptyMap();
    }
    Request req = new Request();
    try {
    	Response resp = rpcClient.rpcFuction(req);
    	if (resp.success) {
    		// 处理返回值
    	}  else {
    		log.error("打印 error 日志");
    		cat.xxxx; // 做业务打点,做监控
    	}
    } catch (Exception e) {
    	log.error("打印 error 日志");
    }
    	return Collections.emptyMap();
}

第二种:定义 function ,把对下游 rpc 的调用放到 function 统一处理

目前更倾向第二种方式,但是想知道还有更好的方式吗?

1085 次点击
所在节点    程序员
9 条回复
adrianzhang
117 天前
还有一种方法,就是不用 try ,出错直接退出,用 crontab 周期脚本,先判断进程在不在,不在的话启动程序,在的话啥也不干。
securityCoding
117 天前
统一封装一个代理?
laminux29
117 天前
历史的做法是消息总线,类似于消息中间件。

想简单搞搞可以直接抓日志,但缺点是实时性差,容易存在业务数据与日志数据不一致等问题。

想要要求高一点,就得改写业务,把监控集成到业务代码里,但这工作量就巨大了,你需要对每个业务调用进行分析、埋点。
xiaopengm
117 天前
aop ?
xiaokongwu
117 天前
各类 HttpClient ,都有类似 Interceptor 的能力吧,实在没有搞个 AOP 也行啊
lvxiaomao
115 天前
@xiaopengm 我们去调用别人内容,并且在方法内部就把下游 response 解析了;所以 aop 也不行,aop 做不到解析方法内部的东西
lvxiaomao
115 天前
@securityCoding 这总感觉跟定义 function 是不是差不多
lvxiaomao
115 天前
@laminux29 是的,在业务里面些日志和监控打点会比较麻烦,而且有些同学可能没有写的习惯 就容易遗漏; 想的是让别人不关心这些日志和监控这种通用的东西,就直接些业务代码就好了
securityCoding
115 天前
@lvxiaomao #7 差不多的,function 实现也是代理装饰作用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1057073

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX