个人介绍
有五年服务端开发经验,主语言Golang,参与过大型分布式项目:广告、视频评论、游戏、IM,熟悉socket网络编程,熟悉TCP、Websocket、Http等协议。对微服务治理有丰富经验,熟悉GRPC、protobuf;熟悉分布式缓存涉及的组件以及分布式缓存的设计。
前端项目做过后台管理、IM等,熟悉Vue框架。
工作经历
2022-10-06 -至今北京畅聊天下Go开发工程师
主要从事网络协议层的研发,例如TCP粘包问题、长连接优化、连接管理等。接触了复杂的游戏业务,进一步提升了解决问题的能力。对redis、kafka等组件的使用以及原理有了更深入的理解。
2020-08-05 -2022-10-06乐融致新Go开发工程师
负责公司广告系统以及视频评论系统的研发维护,熟悉了大部分广告业务,后端ADX、DSP各个系统的工作流程。提升了服务器运维能力,熟悉了gin框架、docker的使用。在评论系统的项目中提升了架构能力,微服务治理、规划能力,缓存设计能力。
2019-08-01 -2020-08-01黑龙江通和昌隆有限公司Go开发工程师
绩效管理系统后端开发,语言是golang,网络框架是beego,期间主要做一些CRUD的工作。了解了基本的接口开发流程、注意事项,熟悉了一些中间件的基本原理:持久化数据库mysql、缓存数据库redis、消息队列nsq
教育经历
2014-09-01 - 2019-06-26北京邮电大学世纪学院电子科学与技术本科
北京邮电大学世纪学院-本科-电子科学与技术
资质认证
技能
* 一个市民需求对应一个订单,订单内的物品也是玩家可以生产的物品。 * 算法要保证订单内的物品尽量不重复。 * 玩家在订单系统中作为岛主角色,不断在岛屿上建立工厂,工厂可以生产物品,市民这些NPC购买生产出的物品(每次购买就是一个订单)。岛主卖出物品完成一个订单即可获取对应的势力值,提升势力值能够提升岛屿等级,提升岛屿等级可以解锁更多的物品种类。售出高级物品能提升更多的势力值。长时间未操作可能新订单里都是低级物品。 * 订单库是为了给不同的服务生成订单,是在后台生成的 * 用户id在某一段内属于培育用户,新用户属于非培育用户。这样做是由于客户端版本差异,培育用户(breed)和非培育用户的处理上有较大差异。 一个岛屿等级也可以确定一个订单列表,该列表中存放订单编号,这些订单编号都 是固定的。一个岛屿等级还确定了订单列表的长度,一个订单编号对应一个订单,一个订单对应一个npc。例如岛屿等级为7,则订单列表长度限制为5,地上最多出现5个npc,也就是最多出现5个不同订单下的物品。
一个基于Vue2.0+beego实现的电商后台管理系统。 技术栈:vue2.0,echars,golang语言,beego框架,jwt鉴权,cors后端跨域,mysql数据库,docker,nginx 项目源代码已上传至github和gitee gitee访问地址 (后端):https://gitee.com/ming0508/BeegoJdStore (前端):https://gitee.com/ming0508/jdstore github访问地址 (后端):https://github.com/Maingol/BeegoJdStore (前端):https://github.com/Maingol/jdstore
后端全部由我开发。支持单聊、群聊、心跳。不支持音视频。底层协议使用http、Websocket。传输协议使用protobuf。发送消息走http,接收消息走Websocket。 关键点:单聊消息存取策略(不支持漫游,当前策略) 参考文章:http://www.52im.net/thread-3887-1-1.html 【写入消息】 消息接受者在线的话,服务器直接把消息写入对方socket,不进行任何持久化存储;离线消息直接写redis,7天有效期,有效期内被读走就立刻删掉。 redis存储: key: IM:MESSAGE_CACHE:[s_uuid] (s_uuid是待拉取消息的用户,field中只包含别人发给自己的消息。不区分单聊和群聊,或者说field既可能是单聊消息,也可能是群聊消息) field: 消息体 score:消息体中的send_time(毫秒时间戳) 示例:A给B发送一条消息a1,则向redis写入: zadd IM:MESSAGE_CACHE:B a1 nowmili 【拉取消息】 自上而下,score(时间戳)从小到大的顺序,一次拉取200条,并判断是否有多余的消息,返回给前端。若有多余消息,则循环拉取,直到取完为止。 - IM:MESSAGE_CACHE这个key首次写入时设置过期时间:7天。