摘要:
普通的zk用法,如下写法:zk.Exists("/aaa", true);zk.Create(...);但是由于这些API会抛Zookeeper的Exception,比如ConnectionLossException, NoNodeException等,所以必须配合一堆try/catch的机制来ca... 阅读全文
摘要:
基于zookeeper写了个Leader选举类库demo,场景如下:上图中的Program1..4可以部署在1台server上,也可以部署在多台server上,也可以是一个进程中的多个线程。运行效果:初始化时(4个全开)把第四个(也就是此时的Leader) 关闭后把某个Follower角色的进程关闭... 阅读全文
摘要:
习惯在C#代码中写str+="xxx";这样代码的请注意啦,如果这种操作是针对单个变量作很多次叠加操作的,很有可能导致性能降低。大家都知道string与StringBuilder的区别,这里就不说了,来看看例子,震撼一下:分别是测试普通字符串进行5w次叠加操作 vs StringBuilder进行5... 阅读全文
摘要:
SQL Server死锁多个事务之间互相等待对方的资源,导致这些事务永久等待注意是永久等待,而非长事务死锁的4个条件互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。非剥夺条件(No... 阅读全文
摘要:
使用了Sqlserver 2012 Always on技术后,假如采用的配置是默认配置,会出现Primary server CPU很高的情况发生,比如默认配置如下:需要自定义来解决这个问题。我们先来看看上图中的这些选项的意义主角色中的连接允许所有连接如果当前server是primary角色时,pri... 阅读全文
摘要:
什么是重构?是在不改变系统行为的前提下,对内部代码的重新组织,提高可理解性和降低修改成本。为什么要重构?一个小修改牵涉到了多个地方,且这些点处于未知状态不易读懂代码(包括读懂自己1个月前的代码)新手修改代码上手慢,需要很久才能进行有信心的代码修改需求变化时,代码层面响应慢什么时候需要重构?随时随地的重构,也就是从一开始就进行小范围的重构,就不至于时间久后没法平滑的重构了上面这句实际上是个方法论级别的,真实中,还是没办法判断什么时候要进行重构,于是换成:当代码中出现了坏味道时需要重构什么是坏味道:存在重复代码时函数体太长函数参数太长无法直观的看出代码逻辑类太大对一个常量存在了多个副本很多很多的i 阅读全文
摘要:
Always on环境的建立,网上资料很多,主要是windows集群的建立以及Sql Server Always on的建立,略容易忽略的是Sql server账号同步问题(Always on能实现数据库内部的同步,但是没法实现instance级别的同步,比如job、账号等)下面来说说几种解决方式:SQL账号采用域账号,让IIS运行于域账号下如果现状下的本地sql账号较少的话还好,否则推行困难,而且还要加入域SQL账号采用域账号,让IIS运行于本地账号下,但是在web.config或machine.config中配置模拟账号基本上与第一种相同SQL账号采用本地账号,客户端连接字符串采用user 阅读全文
摘要:
我们来打造一个简单的专用于json调用的mvc实现,最终会将如下的C#代码暴露给js调用(代码在最后面有下载):public class UserController { public static Json GetUser( [HttpQueryString("x_user")] int userId, [HttpQueryString("msg")] ... 阅读全文
摘要:
用设计模式、AOP能将一个方法/函数包裹起来,并且插入额外的逻辑行为,不过动作比较大,不是很灵活,下面介绍一种链式调用方法来封装的代码,完成后能实现如下的链式调用:public class BO { public bool Add(string msg) { Console.WriteLine("Add"); if (msg == null) throw new Exception(); return true... 阅读全文
摘要:
SUMMARY能做什么DEMO原理图应用场景能做什么A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq、redis、Supersocket可替换。能够实现较彻底的模块事件传递过程中的解耦,支持分布式环境。由于订阅端采用了消息队列作为转发层,因此也能支持事件量很大的场景。DEMODemo工程下载地址(可右键保存):发布订阅Demo.rar一、建立各个工程,并且加入A2DFramework.EventService的引用二、给各个工程加入A2D基本代码,如下:A2DFramework.Starter.Init();A2DFramework.Queue 阅读全文
摘要:
SUMMARY用途DEMO演示NuGet相关的资料VS工具端的设置用途数据验证的作用很重要,目前.NET提供的内建验证机制是采用DataAnnotation方式来实现属性的验证,并且也提供了很多验证Attribute,如下图:不过缺点也有:没有基于场景的验证支持如订单Entity如果是PC录入,则要求验证完整的属性有效性如果是Mobile录入,则要求验证一部分属性有效性如果是后台admin录入,则要求最小属性有效性硬编码导致不灵活生产环境中的维护成本,重新编译、测试、上线管理人员无法修改规则,只能通过开发部门基于上述2点,做了些改进,填补上述缺点DEMO演示先建立工程,然后用NuGet工具引用 阅读全文
摘要:
最近发现windows集群能进行很多自定义,比如在集群中加入自己编写的服务。能自定义的可不少,截个图:本次演示中,只想用“通用服务”这个类型。先列下步骤编写一个记录时间的Windows服务,这个服务会每隔1秒钟写入本地文件当前时间在两台加入了windows集群的服务器中分别安装这个服务(安装即可,不用启动)在windows集群中配置一个新服务,也就是上面这个服务进行故障转移试验编写一个记录时间的Windows服务,这个服务会每隔1秒钟写入本地文件当前时间这个的代码略,没啥可说的,把安装服务、卸载服务的cmd列下面了(InstallUtil.exe需要根据情况从相应的.net framework 阅读全文
摘要:
WCF,很好,却又麻烦,很多时候不想用WCF的原因就是:用这个真麻烦...麻烦的地方,比如:一堆一堆的服务配置,散落在一个一个的folder下,更新系统时容易出错客户端除了要知道WCF Contract外,还要知道服务Provider所在位置所以想了个办法来简化这些,主要思路是:加入Internal Communication Service,简称ICS。用来插入自定义的中间层编写一个Service Locator Service,用来将WCF服务提供者信息抽取统一保存,如:url, endpoint类型,做到wcf服务提供者位置无关性完成后,WCF客户端(包括WCF服务内部调用了其他WCF服 阅读全文
摘要:
所要做的是简化msmq的调用代码以及做到可替代性,实现后,调用消息队列代码变为如下所示:QueueService srv = QueueService.Instance();//检查存储DTO1的队列是否存在,如不存在则自动建立srv.Prepare();//发送类型为DTO1的消息srv.Send(new DTO1() { p1="1", p2="2" });//发送类型为DTO1的消息,并且将发送的消息Id保存到msgId变量中string msgId=srv.Send(new DTO1() { p1 = "1", p2 = &q 阅读全文
摘要:
Until recently, when I write ajax call, always write like below:$.ajax({ type: "post", datatype: "json", url: "someurl", success: function (data) { //some logic }});and repeat everywhere... Until some day: ... 阅读全文
摘要:
js中的嵌套函数用的很多,很牛叉,那为何要平面化?易懂(自己及他人)易修改(自己及他人)平时Ajax调用写法(基于jQuery)$.post('url', jsonObj, function (data) { if(data) { var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation successful!' }); ... 阅读全文
摘要:
一致性环Hash算法有一个大用处就是解决Memcache服务器down机问题的。目的是增加或者移除Memcache服务器后,最大限度的减少所受影响。理论方面的就不介绍了,网上有太多资料了,请大家自己搜索搜索。在此写了一个ConsistencyRing类来实现算法,具体代码在此下载。测试类如下:public static void Test() { { ConsistencyRing cr = new ConsistencyRing(); Console.WriteLine("============... 阅读全文
摘要:
考虑到sql server以及c#,最多只能用decimal类型,也就是29位的数字,做了下面这个数字型id生成器:class Program { static void Main(string[] args) { int i = 100000; Timing t = new Timing(); t.Start(); while(i-->0) UniqueIdGenerator.Next(); t.Stop(); ... 阅读全文
摘要:
A2D Framework增加了EF支持,加上原先支持ADO.NET:支持EF方式支持ADO.NET方式这次来讲如何让Entity Framework变成nb的读写分离1. 先设计EF模型, 可以图形方式设计,也可以数据库优先方式设计,总之设计完后,再转换成Code方式使用(用)2. 在DbContext类中,删除EF自动添加的报错代码,如下:protected override void OnModelCreating(DbModelBuilder modelBuilder){ throw new UnintentionalCodeFirstException();//... 阅读全文
摘要:
我们来比较下散列的3种冲突解决方式,建立3个类,分别代表3种不同的冲突解决方式:MyHash_MAD_多槽位MyHash_MAD_独立链MyHash_MAD_线性探测法然后在主程序中分别插入10000条记录,比较各自所需要的时间。先介绍下:MAD:multiply-add-divide method,乘法 - 加法 - 除法(取模),如下这个公式是散列核心公式(a*collisionIndex+b)%M, M要求是素数,a, b的取值要合理冲突解决方式:多槽位当计算出的Index位置处已经被占用后,还是会在这个index的地方增加一个元素主数组的每个元素是个列表(比如每个元素都能放5个子元素) 阅读全文