一个高并发的需求,大家可以讨论讨论,集思广益

1. 需求

昨天接到一个需求,需要我把Jenkins运行完的任务日志(日志很大,有的几十M)存起来,到时候上游会有多个进程,不断的给我传数据,我需要把他们传的日志入库,他们请求的频率很高,可能每秒大几百次,然后这些日志后续还需要有查找功能 根据测试集id查找后 展示到前端,假如某个测试集正在运行,那么这个日志还需要和前端建立websocket连接,不断的把最新的日志推送到前端

这个其中一个进程的请求实例,每个info就是一次请求,我没有copy完整,可能存在多个进程请求。

TicketServiceFits_BC
2023-01-11 09:23:57,870 - INFO:     实际结果:P
2023-01-11 09:23:57,870 - INFO:         la
2023-01-11 09:23:57,870 - INFO:         设置
2023-01-11 09:23:57,871 - INFO:     label_
2023-01-11 09:23:57,871 - INFO:     实际结果:P
2023-01-11 09:23:57,871 - INFO:     userna
2023-01-11 09:23:57,871 - INFO: 设置变量:usern
2023-01-11 09:23:57,871 - INFO: 设置变量:获取用户信
2023-01-11 09:23:57,872 - INFO: 交易日 关键字-fl
2023-01-11 09:23:57,872 - INFO: 设置变量: {"ex
2023-01-11 09:23:57,872 - INFO:     exchan
2023-01-11 09:23:57,872 - INFO:     设置变量:e
2023-01-11 09:23:57,873 - INFO:     exchan
2023-01-11 09:23:57,873 - INFO:     实际结果:"
2023-01-11 09:23:57,873 - INFO:         ex
2023-01-11 09:23:57,873 - INFO:         设置
2023-01-11 09:23:57,874 - INFO:     交易日信息 
2023-01-11 09:23:57,906 - INFO: 设置变量:交易日信息
...

2.我的思考

我思考了下,这个每秒钟几百次请求,我们的机器是window server 2012,532G的内存。直接在laravel里做,估计扛不住,可能还会影响平台主要业务,然后日志这种大文件存储,mysql肯定不适合了,我这边打算用mongdb来存
因为涉及的功能很简单 我打算用一台新机器,直接用原生php来写,毕竟只涉及简单的入库,代码也简单,效果高。

然后我的方案就是 nginx+php+mongodb ,然后收到请求后把数据直接扔到队列里处理。
对于和前端交互的部分,我是打算每次前端请求的时候,查询当前测试集是否运行完了,如果没有运行完 则通知前端和我进行websocket连接,这时候把已经建立的websocket的测试集id存在缓存里,然后收到该测试集id的日志时 就调用gateaway-worker群发功能 把日志推送到群里组

大家有没有好的思路,可以讨论讨论!多多指教 谢谢大家
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

kafka+es。 上游不在给你传而是直接存到kafka。 你多开几个进程读取存到es。 后面查在es里面查

1年前 评论
xiao (楼主) 1年前
讨论数量: 54
Mutoulee

建议直接存文件吧,再次用这些日志的时候再读取分析。

1年前 评论
shunjian_1 1年前
Mutoulee (作者) 1年前
wxfjamdc 1年前
xiao (楼主) 1年前
xiao (楼主) 1年前

按照日期写到log里,一条一行,内容使用json形式存储

阿里云日志管理配置日志路径到日志目录下,过期时间配置一年

查询的时候在阿里云日志那边随便查

再找找看有没有相关接口可以取

实在不行就接收后入队列,队列写入mongo或es,给前端的话直接在mongo或es里查

1年前 评论
xiao (楼主) 1年前
zjason (作者) 1年前
zjason (作者) 1年前
xiao (楼主) 1年前
zjason (作者) 1年前
xiao (楼主) 1年前
zjason (作者) 1年前
xiao (楼主) 1年前

mysql 就可以 ,把日志丢到redis队列,然后慢慢写入mysql中,日志多就分表,

1年前 评论
xiao (楼主) 1年前
zjason 1年前
xiao

回复 wxfjamdc 老哥 确实是的 所以还需要和前端建立 websocket 连接

1年前 评论

我们公司是一个支付系统里面日志也是特别多,我们的做法是日志先进队列,然后一台服务器专门处理r队列的信息进行消费(多进程 swoole),然后使用了seaslog 这个支持文件查找, 日志查询的时候也比较方便,目前用起来还算可以,一般高并发主要还是要考虑异步和削峰。

1年前 评论
xiao (楼主) 1年前
carter (作者) 1年前
carter (作者) 1年前
xiao (楼主) 1年前
lufeijun1234 1年前
JeffreyBool

kafka + es

1年前 评论

kafka+es。 上游不在给你传而是直接存到kafka。 你多开几个进程读取存到es。 后面查在es里面查

1年前 评论
xiao (楼主) 1年前
白小二

大兄弟有结果了吗?php-fpm如果是长期几百并发,4核4线程8g的centos服务器扛不住。想知道下你这个配置能不能扛得住

1年前 评论
zjason 1年前
xiao (楼主) 1年前
白小二 (作者) 1年前
xiao (楼主) 1年前

期待结案

1年前 评论
xiao (楼主) 1年前
xiao (楼主) 1年前
yzbfeng (作者) 1年前
xiao (楼主) 1年前
xiao (楼主) 1年前
renxiaotu 1年前
xiao (楼主) 1年前
renxiaotu 1年前
renxiaotu 1年前
xiao (楼主) 1年前
xiao (楼主) 1年前
renxiaotu 1年前
renxiaotu 1年前
xiao (楼主) 1年前

要是就用php写,webman框架就够用了,单机都不到1000的并发,日志会用MongoDB,就先用MongoDB,不会就用mysql先存上,按照每天分表,使用云mysql最佳,然后定时清理过期的不需要的日志,qps1000而且,webman玩一样

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!