是什么:
标题写的我自己日后都可能忘记,这里简单叙述一下。当前我们有个 这样的需求,就是客户调用接口中含有多个子接口,每个子接口都需要单独请求一次下游微服务,问题在这里出现了,我们需要将客户的一定请求才分成多个子请求,分别访问成功后再合并成一条记录存入数据库中。
如图:
![图一](https://i-blog.csdnimg.cn/blog_migrate/4072aa780f494e8a171081b9321f69e9.png)
其中我们的需求是,微服务端记录日志,并通过另外一个程序将三台微服务上的日志抓取下来合并到一起持久化的mysql中。
怎么做?
首先是在请求接口上做手脚,将一个请求带上两个参数,分别是 num(子接口个数)和reqId(请求ID),这样我们就能先通过reqId找到属于同一个请求的子请求,再通过num保证请求的完整性。
方案一、 利用MySQL
我们可以将每台服务器行的日志通过flume直接怼到mysql的一个临时表,再通过reqId进行关联/分组查询转储到另一张表中。
评价
优点:技术简单,流程也简单
缺点:当数据量大事对MySQL压力过大,其次时效性不高
方案二、利用storm(推荐)
![图二](https://i-blog.csdnimg.cn/blog_migrate/ceddbd44c59c505a858bf7e7bc682e39.png)
先通过flume采集微服务上的日志,然后丢到kafka再由storm进行流式计算,将reqId相同分发到相同的bolt,用一个list存储当list等于num时写到MySQL。
评价
优点:稳定
缺点:战线拉的优点长
方案三、Hive
![图三](https://i-blog.csdnimg.cn/blog_migrate/251fc4f9f5ade27383e4768e415fc2c3.png)
这个方案太重了,看图大家应该就明白了。
评价:
优点:和方案一相比好些
缺点:不实时,过于繁重