引言
最近面试遇到这几个问题没答好,一半是紧张,一半是基础还不扎实,做一下记录。
如果遇到很类似的七个管理系统,如何快捷开发?
Don't repeat yourself
- 将系统公用的模块封装成工具类,搭建其他系统的时候可以直接使用。例如:用户管理模块,登陆验证方法。
- 统一api接口返回格式,例如:
def api_bye(obj = {})
http_status = 200
http_status = obj.fetch(:status, 200) if obj.is_a?(Hash)
res = { result: obj}
render json: res, status: http_status
end
- 常用功能组件化,情况允许也开源组件来帮助社区。通过安装组件就可以实现某些常用功能。例如:ruby里通过
gem
命令安装,python里是pip
命令安装。 - 代码生成器。通过实现代码生成器,来生成默认的项目目录,项目主体文件。
- 保存数据库建表脚本,可通过修改通用脚本的方式创建数据库。
如何在处理支付回调的时候,保证数据不被重复更新呢?
- 处理回调请求时,更新数据的部分加入队列进行处理,记录日志并对回调方直接返回success,避免重复回调。
- 生成预支付订单时,记录当前余额。
- 对要被更新的数据加上行级锁,排他锁。
- 在余额数据修改时,检查账户余额与预支付订单中余额是否一致,订单状态是否为支付处理中,不一致则停止更新。
- 用户的余额修改与订单的状态修改应该写进一个事务里,保证一定同时修改成功。
http会传cookie么?
- cookie在浏览器第一次访问服务器的时候,由服务器记录并生成name,value的结构数据,并跟随response一起返回给浏览器,之后由浏览器维护。
- 从服务器端,发送cookie给客户端,使用set-cookie,创建或更新对应的cookie。
- 浏览器会保存这个cookie,且之后每一次与服务器通信,都会在Request Headers中加入cookie,用来标记每次请求。
- 在服务器会创建session来储存浏览器的请求信息。
在浏览器控制台可以看到headers的内容。