V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  night98  ›  全部回复第 23 页 / 共 68 页
回复总数  1352
1 ... 19  20  21  22  23  24  25  26  27  28 ... 68  
2022-04-02 22:00:40 +08:00
回复了 zhongjun96 创建的主题 程序员 寻找一个 Java 应用本地更新方案
4G 内存够够的,java1g ,mysql1g ,nginx0.5g ,完美
2022-04-02 01:14:01 +08:00
回复了 zhongjun96 创建的主题 程序员 寻找一个 Java 应用本地更新方案
linux cron 每天晚上 3 点定期拉取 docker hub latest 镜像并重启,java 服务打包成 docker 镜像,内置一下 flyway ,最好买个 flyway 的授权
用阿里的 dms 啊,生产环境禁止外网这个没啥疑问吧?
2022-03-29 01:42:37 +08:00
回复了 yoloMiss 创建的主题 Redis 请大佬指点一下, redis 模糊匹配 key 查询缓慢问题
1.为啥会有这种需求?
2. 能不能在数据生成的时候基于需求扔到对应 list 里去,比如 123* 的 string 放到 123 的 list 里面
3. 换其他服务处理,比如 es ,数据量不大直接 mysql
2022-03-28 17:16:11 +08:00
回复了 palemoky 创建的主题 问与答 Kafka 有了时间轮,为什么不支持延时队列?
定时任务和延时任务都是绝对时间,kafka 实现了时间轮,但延时队列这玩意还是比较复杂的,因为延时任务存在不可预期性,比如一个 task 是十分钟后执行,还有一个 task 是半年或者一年后执行,这种情况下直接使用单个时间轮会导致圈数过大,而且一个槽中的所有任务分发也是比较复杂的逻辑,而且 kafka 的定位是实时流处理平台,这种业务支持也没啥太大好处。
2022-03-25 00:09:28 +08:00
回复了 Jat001 创建的主题 职场话题 讲个笑话🐶
真实
2022-03-22 19:25:04 +08:00
回复了 sciel 创建的主题 程序员 各位都是如何面对自己以前写的代码的呢?
@JDog 学习了
2022-03-22 00:03:33 +08:00
回复了 night98 创建的主题 程序员 Tomcat 高并发情况下响应时间优化
@zoharSoul 明天加个 skywalking 监控一下看看,现在用 jprofiler ,对性能影响比较大,有没有其他的推荐的?
2022-03-21 23:32:38 +08:00
回复了 night98 创建的主题 程序员 Tomcat 高并发情况下响应时间优化
@zoharSoul 哈哈,这个可以试一下,不过看 mysql 监控 cpu 一直没打满,尝试增加数据库连接池线程数反而性能更低,所以一直想先压榨出应用极限性能
2022-03-21 23:31:08 +08:00
回复了 night98 创建的主题 程序员 Tomcat 高并发情况下响应时间优化
@pkwenda 补充一下,期望 RT99 80ms 内,tps1800 左右?

然后 1c1g 是 mysql 的配置,买的单独的服务,应用机是 2c4g ,只跑了这一个服务,配置了 2g 内存
按照您提供的意见,明天我调整到 4c4g 试试。看阿里云控制台 ecs cpu 峰值大概也才 70 左右,线程数估计是控制在 120-150 左右比较合适

jdbc 连接池用的 HikariCP ,配置是 4 个连接,orm 用的 mybatis plus ,初期调优的时候把接口 A 的批量插入优化了一下,有小部分的提升。

日志默认用的 springboot 的 logback ,打算把整体压到 80 再试试 log4j ,然后再试一下 log4j 全异步日志的性能差异,现在就是卡在 tomcat 线程池调优这块了。

TPS/QPS 基本是 1:1 ,接口 A,B 都主要是插入或者更新操作。

压测用的阿里的 PTS ,直接用他们的机器,单机封顶在 2000QPS ,这个可以调多点,不过试了下结果还是一样的,甚至延迟还高了一点。
2022-03-20 23:30:56 +08:00
回复了 frank1256 创建的主题 Java Java ,大量对象内存中计算, oom 怎么处理哇。
10 个线程每个线程查 100 条,然后更新原子变量,完事。一次性加载一百万条,只能加钱。
2022-03-20 17:17:35 +08:00
回复了 leomm 创建的主题 优惠信息 3 月 20 号腾讯云香港新加坡云服务器约 3 年 33 元-166 元 8 台
+1
2022-03-20 16:44:36 +08:00
回复了 huf 创建的主题 分享发现 看博客需要关注微信~
这种十之八九是洗稿的,拿里面代码片段随便一搜就能找到原文
2022-03-19 17:48:48 +08:00
回复了 cxsz 创建的主题 Java 被怼的莫名奇妙的,这么写会出空指针?
楼主写的没问题,这个 list 一看就知道是从数据库拿的,也判空 list 了,如果 list 里面还有元素能为空的话,先把数据提供方拉出去打一顿吧。
2022-03-19 02:34:35 +08:00
回复了 niceyuri 创建的主题 问与答 关于 CodeReview,和团队小伙伴产生了分歧。
补充一下回复,关于 code review ,比较好的做法是完成一个业务功能提交一次,单次 review 尽量保持在 300 行以内,以 Java 为例,使用 mybatis 或者 jpa 对数据表进行建模生成 model 后并添加对应枚举后,提交一次 review ,这次 review 速度一般比较快,基本上都是按团队规范和机器自动生成的,没啥太多 review 的地方,最多检查下是不是建模有问题,一般一两分钟搞定。接着就是常规的功能 review 了,通常建议拆分为业务功能多次提交,以最常见的订单系统为例,会拆分出例如订单分页接口,订单详情接口,订单提交接口,这三个接口分别提交三次 pr+review ,主要目的是保持 review 的单个逻辑连续性,如果单次提交在 1000 行以上,作为 review 评审者,其实相对难度较大,通常还需要 clone 到本地详细查看,成本太高,可能就直接点通过省事了,关于 review 其实从出发角度来看,其实是为了提升整体代码质量,避免代码崩坏,减少后续维护成本。比如团队如果有实际的代码规范的话,reviwe 主要就是关注代码规范,加上潜在 bug 发现,以及一些常规的代码质量改进,例如可以用新特性或者其他更好的方式去实现。关于你提的这个问题其实我觉得也挺有意思的,其实还是那个问题,你们老大呢,工程实践这玩意说实话就是有和没有在短期没什么太大差距,都是长期来看才有价值,否则也没有那么多的人会写垃圾代码了
2022-03-19 02:25:20 +08:00
回复了 niceyuri 创建的主题 问与答 关于 CodeReview,和团队小伙伴产生了分歧。
先问个问题,你们老大呢?
淘宝渠道全挂了,下不了单
简单问问,出几个应用场景的上机题,看看真实水平
槽点太多,哈哈

@Override
public Response login(String params) { // 入参改成 VO
try {
JSONObject jsonObject = JSON.parseObject(params); // 这块干掉
// 解密手机号码
AesNewUtil aes = new AesNewUtil();
String decMobile = aes.decrypt(jsonObject.getString("mobile")); // 改成静态方法
// 获取 openId
String openId = jsonObject.getString("openId");
if (StringUtils.isEmpty(openId)) { // 入参时校验
return Response.fail(RespCode.PARAM_NULL);
}
logger.info("openId : {}", openId);
// 查询代客用户表
ValetUser valetUser = selectUserByMobile(decMobile);
// 用户是否存在于白名单中
if (null == valetUser) { // 入参时校验,了解一下自定义注解验证
return Response.fail(RespCode.NO_GET_INFO);
} else {
String userId = valetUser.getUserId();
// 判断用户信息是否存在
ValetUserInfo valetUserInfo = valetUserInfoMapper.selectByPrimaryKey(userId);
if (null == valetUserInfo) {
// 保存用户信息
valetUserInfo = new ValetUserInfo();
valetUserInfo.setUserId(userId);
valetUserInfo.setOpenId(openId);
valetUserInfo.setCreateTime(DateUtils.getNowDate());
valetUserInfo.setUpdateTime(DateUtils.getNowDate());
valetUserInfoMapper.insertSelective(valetUserInfo);
}
// 获取 token
String token = TokenUtil.generateToken(userId, decMobile, "app");
cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().set(Constants.USER_AUTH_PRIFIX + userId, token, 7, TimeUnit.DAYS);
// cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().set(Constants.LOGIN_MOBILE_AUTH_PRIFIX + userId, decMobile, 7, TimeUnit.DAYS);
// logger.info((String) cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().get(Constants.USER_AUTH_PRIFIX + valetUser.getUserId()));
Map<String, Object> result = new HashMap<>(); //返回改成 dto
// 用户类型:0 无效,1 网格,2 客户经理,3 泛渠道,4 其他
String userType = String.valueOf(valetUser.getUserType()); // 这里改成枚举+find 方法
if ("0".equals(userType)) {
userType = "无效";
} else if ("1".equals(userType)) {
userType = "网格";
} else if ("2".equals(userType)) {
userType = "客户经理";
} else if ("3".equals(userType)) {
userType = "泛渠道";
} else {
userType = "其他";
}
result.put("mobile", valetUser.getMobile()); // 这里用 beanutil 或者 mapstruct 优化,一行完事
result.put("userName", valetUser.getUserName());
result.put("cusName", valetUser.getCusName());
result.put("userType", userType);
result.put("operId", valetUser.getOperId());
result.put("orgId", valetUser.getOrgId());
result.put("merchantNum", valetUser.getMerchantNum());
result.put("token", token);
// 更新用户表登录时间
valetUserMapper.updateLoginTimeByUserId(DateUtils.getNowDate(), userId);
logger.info("登录成功 {}", decMobile);
return Response.success("登录成功", result);
}
} catch (ValetappException e) { //改成全局异常处理
logger.error("登录失败 : " + e.getMessage());
return Response.fail(RespCode.FAIL);
}
}



改完差不多这样
@Override
public Response login(@Valid UserVO user) {
logger.info("openId : {}", openId);
String decMobile = AesNewUtil.decrypt(user.getMobile());
String userId = valetUser.getUserId();
ValetUser valetUser = selectUserByMobile(decMobile);
// 判断用户信息是否存在
ValetUserInfo valetUserInfo = valetUserInfoMapper.selectByPrimaryKey(userId);
if (Objects.isNull(valetUserInfo)) {
// 保存用户信息
valetUserInfo = ValetUserInfoMapper.convert(user);
valetUserInfoMapper.insertSelective(valetUserInfo);
}
String token = TokenUtil.generateToken(userId, decMobile, "app");
cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().set(Constants.USER_AUTH_PRIFIX + userId, token, 7, TimeUnit.DAYS);

String userType = UserType.find(valetUser.getUserType());
TokenInfo token = tokenmapper.convert(valetUser,userType);
valetUserMapper.updateLoginTimeByUserId(DateUtils.getNowDate(), userId);
logger.info("登录成功 {}", decMobile);
return Response.success("登录成功", token);
}
1 ... 19  20  21  22  23  24  25  26  27  28 ... 68  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1026 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 41ms · UTC 20:35 · PVG 04:35 · LAX 12:35 · JFK 15:35
Developed with CodeLauncher
♥ Do have faith in what you're doing.