大家好,我是大彬~
今天跟大家分享知识星球小伙伴提出的一些技术问题和解答。
球友提问:
彬哥,我们项目组要求用户敏感数据加密存储,主要的问题:
1 、加密后如何查询才能击中索引;
2 、用户身份如何验证(手机号、身份证);
大佬有什么建议吗?
大彬的回答:
首先需要一个专用于加密解密的服务。
所有加密解密操作都访问该服务。 可访问数据库的人, 秘钥管理人,加密服务管理人,三者不能有任何一方有办法获取到所有信息。
接下来回答你的两个问题:
1、加密后如何查询才能击中索引?
使用 hash 查询。加密字段只允许精准查询,不允许模糊。如果一定要模糊,那也是有限制的模糊,提前定好模糊规则,根据模糊规则提前预留相关数据,再进行加密。
2 、用户身份如何验证(手机号、身份证); 验证后再加密,或者允许解密。
需要注意的是:
- 不同业务场景对脱敏的要求是不一样的。我们公司的要求是,任何人任何时候都不能看到明文,明文只出现在内存中。
- 解密后,明文只能存在内存中,调用解密必须要有日志。
球友提问:
大彬哥,请教您技术方案,我们项目有个场景,需要在一段时间内发了n个相同的mq消息,去更新数据,只需要保留最后一个消息就可以,前面的都可以不要,应该怎么实现?
大彬的回答:
收到消息后先往redis写,如果存在就直接覆盖,如果不存在就先写入,并且发送一条延迟消费的消息到mq,具体延迟多久可以是大于等于你说的一段时间内这个值。然后收到延迟消费的消息时直接去取redis的消息,这条消息基本就是这段时间内的最后一条消息了
球友提问:
大佬你好,请教一个问题。 有两个百万条数据的表以及三张万以内数据表,取数据的时候不可避免要 join。 客户端可以自由调整日期,来查看数据。 因为表数据十分钟同步更新一次以及用户自由调整日期,感觉没办法做缓存。 现在每次查询都要 join 一次,导致查询数据很慢,要 10s 多,请问一下要怎么优化?
大彬的回答:
如果能改表结构的话,把索引和内容分开存,其实百万级的数据全放内存里应该是没问题的。如果非要 join,要么降低 join 的数据规模,要么提前算好数据,要么把能缓存的数据(比如那 3 张表)缓存起来,尽量降低查询时的磁盘消耗。
往期星球提问整理:
球友提问:
大彬哥,请教一个问题(之前面试问到的),怎么做到增加机器线性增加性能的?
大彬的回答:
你好。线性扩容有两种情况,一种是“无状态”服务,比如常见的 web 后端;另一种是“有状态服务”,比如 MySQL 数据库。
对于无状态服务,只要解决了服务发现功能,在服务启动之后能够把请求量引到新服务上,就可以做到线性扩容。常见的服务发现有 DNS 调度(通过域名解析到不同机器)、负载均衡调度(通过反向代理服务转发到不同机器)或者动态服务发现(比如 dubbo ),等等。
球友提问:
彬哥,请教你两个问题:
- 新功能提测之类的,流程是怎样的,是各个功能特性分开提测还是一起合并了提测?另外比较偏向业务的,单元测试集成测试这些要求怎样,还是会在合入的时候进行限制,不到一定比率不允许合入?
- 一般线上出事故了,就是开会总结、发邮件改进流程之类的。彬哥有没啥经验之类的可以分享?
大彬的回答:
1.像我们项目组的话,服务有一定程度的拆分,每周都会上线,冲突的概率不高。如果冲突了,那就合并测。单元测试有要求,但是最高就要求到40%,再高维护成本太高。
2.总结发邮件肯定是少不了的,我分享一下我们这边的流程,你可以参考一下。
a.发现线上事件后,需第一时间报告运营经理,项目经理。
b.判断线上事件的性质,对外报告处理故障进展,按流程要求通知相关负责人。
c.问题处理。如果问题比较紧急(故障分为A/B/C三个等级),需要立即通知相关部门的领导,由各部门领导协调事故处理,一般要在2小时内给予解决,保证系统恢复正常。
d.线上故障处理后都需要测试人员进行跟进,问题修复后第一时间验证,然后按照上线管理流程进行程序发布
e.通知业务方
持续更新中...
往期星球提问整理: