工作总结知识
用到的开源项目
消息队列:
MSMQ
ZeroMQ
ActiveMQ,Java系,整套系统如果本来就是Java的,配合的默契更佳
RabbitMQ,Erlang,基于AMQP协议(AMQP首先满足的是金融系统的消息通讯业务需求)。RabbitMQ的性能比ActiveMq更强,是非Java系统的首选
知识点
1、系统升级涉及到的文档编写
升级的话,就只要考虑,基础就是生产环境就行了
l 初始环境=》生产环境 【安装文档】
l 生产环境=》升级 【升级文档】
2、中间件数据流程图.vsd
l 流程图,把数据存储实体(文件/数据表)表现出来
l 流程图+数据流图,是传统面向过程的一组CP
3、共享变量
可能同时操作的变量/存储,需要考虑加锁
4、 程序断电或挂起的影响
缓存数据考虑是否写入数据库,处理的置标示位,启的时候读取那些未处理的数据
5、阿里云服务器防火墙和安全组规则
l 服务器的防火墙和安全组规则是两个事.
去过香港没?
就相当于你去香港过关,在大陆这边有一个关口检查,香港那边也有一个关口检查。
外网访问就是你要去香港,服务器防火墙就是香港的关口,阿里云安全组规则就是大陆的关口。
l 必须两个都开放才可以。
那阿里云安全组规则 只设置了特定少数端口的话【已经达到限定少数端口可入的目标】。
服务器防火墙不开启也没事咯?
是的。
l 阿里云安全组规则 开启了所有端口(1024-63356)的话,若阿里云服务器的防火墙开启,则加入到入站规则里的端口才可以被访问。
6、永远不要相信用户的输入
Web项目,前端校验和后端校验 都需要加上。
同时考虑 多用户/开多tab页操作的情况,也需要前后端校验同时存在。
7、查看dll是32位还是64位
- 托管dll(.net的dll)
通过VS命令提示符中的CorFlags命令可以查看.NET版的dll的位数,查询命令是:corflags+dll的路径。在查询结果中如果32BITREQ的值为0表示dll是64位,1表示dll是32位。
- 非托管dll(C++的dll)
通过VS命令提示符中的dumpbin命令可以查看.net和非.net的dll的位数,查询命令是:dumpbin /headers C:\Temp\Oracle.DataAccess.dll。在查询结果中,如果FILE HEADER VALUES中有32 bit word machine的值,表示dll是32位。
8、善用模拟
在测试 用命令行去启动一个应用,然后执行一些操作时,出现错误,如何排查?
用打印日志的方式,可以,但是不够高效;
用模拟的方式,将args赋值,模拟数据,打断点调试!
接口沟通制定
1、外部(厂家)接口制定
l 调用规则
(哪方触发调用、post/get、接口含参数时是否参数名称得完全一致(大小写)、多接口对应多个url还是一个url【根据方法名来区分业务】)
l 一般数据处理流程
(打印日志保存原始上报数据、数据校验【必传字段/业务所需字段 是否不为null,没传就是null】、保存业务历史数据、进一步处理)
注意:外部接口对响应时间有无要求,考虑是否校验完就对接口做出响应(回复收到正确/不正确数据)。后台线程处理接收的数据。
2、WebAPI
别人给你一个api接口,自己需要定义请求参数和返回参数【//根本不用定义返回Model,可以采用动态解析dynamic,只获取自己所需要的参数,参考github-selfTest】。
需要注意,返回字段值类型都设为可null类型,eg 不能decimal ,应该用decimal?
因为设置为decimal时 返回的是null的话,会报错。
更多参考:https://www.cnblogs.com/linJie1930906722/p/6103455.html
概念边界理解
智慧XX中间件
1. 多城市试点同一软件方案
分两个层面理解:一个软件为每个客户部署一个实例;一个实例同时接入多个客户。
目前我们按第一种的级别在做;第二种级别我们可以先来做的是再梳理确认数据存储是否满足多省市接入,而程序上的满足先列入规划待设计。
2. 中间件与云平台的关系
简言之,中间件管设备,云平台管运营和应用;中间件与云平台存在需要双向同步数据的关系。
3. 为何不提供新增车场?
在定义中间件的边界时,车场的管理归纳到云平台,中间件聚焦设备的管理,依赖的车场信息由云平台同步过来。
数据库设计
1、没有完美的数据库设计,只有符合业务的数据库设计!
2、我们的数据库设计,在遵守标准(三大范式)的同时也要考虑客户的体验!
有用户才有天下!
3、数据库设计时必须要做的
- 需求的分析;
- 考虑需求可能的变更(预留设计);
4、数据库设计中具体要注意的几点;
- 凡是用户输入的不能作为主键;主键是唯一的,一般不能让客户做任何操作;
- 凡是有业务意义的不能作为主键;既然是具有业务意义,客户随时都有可能提出这个业务,要求修改业务,也会有变动的可能!
- 除非确定是有必要的字段,其他都允许为空;
- 设计数据库时,约束简单点最好,约束多则在系统中开发时要注意的就多,开发效率相对会底,因为系统是可以通过验证辅助完成这些约束的!
- 不能缺少时间或日期字段、并预留备注字段;
- 业务的时效(时间有效)性;
- 数据的采集宁滥毋缺
- 预先计划:比如考虑到用户可能会误操作,然后又要求维护人员恢复数据,需要对表进行软删除(逻辑删除,也就是增加一个IS_DELETED字段,0表示正常,删除操作就是将该字段设置为1)
5、字段是否允许为空的思考
为空的选项,就是为了表示未知的情况。
如果为空,查询条件就必须处理为空的情况,否则会出现一些很奇怪的问题。也就是说,几乎所有的判断都必须加上 is not null 或者时 is null 的判断。 其实在部分情况下可以使用默认值。
6、Drop Table
要增加数据列的话,不好采用Drop Table重新Create Table,因为会把数据也删除掉,最好用Alter语句。
alter table OrderMaster add IsMonthly int(11) not NULL DEFAULT 0;
alter table OrderSearchSummary add IsMonthly int(11) not NULL DEFAULT 0;
7、不同类别的一个属性 不要用相同的字段名
eg,视频各算法权重weight,各检测方式权重weight,可以修改为W_WEIGHT和A_WEIGHT
8、 写数据表名的说明/注释
9、 需要枚举的地方 尽量写清楚
10、 字段引用的哪个表的哪个字段也在注释(说明)里写清楚
项目组织
我们的实体、契约、访问数据库操作、记录信息或者发送邮件的业务逻辑应该始终放在单独的 .NET Core 类库项目中。
应用程序中的每个小项目都应该包含多个文件夹用来组织业务逻辑。
测试系列
测试A、B方案
1、 Plan A,按照客户的功能要求来测
2、 Plan B,考虑一些异常/极端情况,程序最好留些开关,可随时配置不同的处理
例如:
-》测试正常停车时,能不能配置“状态”固定,全是正常,不管违停。【需要考虑会不会混合测试,正常和违停同时测】
-》外部接口(ip/消息队列)联不通的情况下(最好发短信通知,可配置开不开短信【这样可控制连不上时不要一直发】),将要推送出去的数据也得保存。
功能自测
1、界面查询数据
是否需要支持模糊查询;
查询条件每种情况都得测试(地址位置组合:全不选、全选、选某几个…)
2、数组、列表取值
切记:索引超出范围的问题。
3、 线程问题
3.1不要一直循环创建线程,内存不足。
单线程处理 循环取数据
3.2 多线程处理,注意临界资源(静态变量…)的处理
加锁
4、 注意对象为NULL的判断
5、程序需要退出,但退出前需要做一次释放动作,可以用try catch finally,写在finally里面
6、若用缓存,注意缓存中的数据修改之后 是否会更新缓存
7、性能提升建议
Sql数据表建索引;
将基础数据的sql操作改为缓存中读取(uwb、vpd泊位转换);
设计模式
常见的设计模式 与.net相关
1、创建型
单例模式、
工厂方法(面向接口)、简单工厂(if else)、抽象工厂(反射+配置文件)
原型模式(System名称空间中提供了ICloneable接口,唯一的方法clone(),只要实现这个接口就可以完成原型模式。浅拷贝/深拷贝,DataSet的clone/copy)
2、结构型
适配器模式:将一个类的接口转换成客户希望的另外一个接口。在双方都不太容易修改的时候再使用适配器模式。net中DataAdapter就是在各种数据库源和DataSet之间适配以检索和保存数据的适配器。
组合模式:组合模式使得用户对单个对象(eg文件)和组合对象(eg文件夹)的使用具有一致性。ASP.NET中的TreeView控件
代理模式:在客户端和目标对象之间增加一层中间层(关联)eg:电脑中的快捷键。.net中Webservice使用时 添加web引用,生成的WebReference就是代理,让我们可以通过它调用远程的服务。
3、行为型
策略模式:使算法的定义和使用(客户端)分开,每一个类(策略)封装一种具体的算法
模板方法模式:通过把不变行为搬移到父类,去除子类中的重复代码
观察者模式:【发布订阅】微信中的订阅,.net中的事件委托
迭代器模式:.net中IEnumerator、IEnumerable,分离了集合对象的遍历行为
CMD常用命令
C: |
打开C盘 |
md supermva |
创建supermva文件夹 |
color a |
命令行颜色改为绿色(更有逼格一些) |
cd supermva |
打开supermva文件夹 |
cls |
清除命令行 |
dir |
查看文件目录 |
cd.. |
返回上级目录 |
notepad 1.cs |
直接打开notepad |
cd\ |
返回到跟目录 |
Tab |
自动补全功能 |
F7 |
查看历史命令 |
exit |
退出cmd |
tree /f |
递归显示目录结构 |
架构/技术选型
依据:
- 为了应付项目需求的不断变化和项目的可扩展性,我们也会引入OO和设计模式;
- 为了解除各模块和组件的耦合,我们也会利用IOC的思想解耦;
- 为了让逻辑代码清晰且没有其他代码的干扰,我们也会采用AOP的方式进行代码重组;
- 为了使项目的开发速度更快且更方便,我们也会引入ORM思想来加快项目的开发速度和可维护性;
- 为了更好组织各层开发,隔开耦合,我们也会采用MVC、MVP、MVVM模式;
- 为了提升用户的响应速度,我们会采用AJAX的方式来实现;
- 为了降低系统的负载同时提高用户的响应能力,我们也会采用MSMQ/ZeroMQ/ActiveMQ/RabbitMQ来组织消息队列;
- 为了规范各系统的接口,提供一个统一的交互平台,我们也会采用SOA;
- 为了降低服务器的负担和提高速度,我们也会自己写一套缓存;
- 为了把产品做好,我们也会不断优化技术;