15年开发架构经验,熟悉Java .NET,3次微软MVP
源代码见 http://wcfextension.codeplex.com/ 注意: 1) 本来没打算这么早开源,这只是一个比较原始的实现,请勿直接在商业环境使用 2) 请注意本框架的授权条款Apache License 2.
以前写过一个MVC执行流程的分析的文章: http://www.cnblogs.com/lovecindywang/archive/2010/12/02/1894740.html 使用一些自定义的代码埋点方式来解析MVC框架颞部的执行过程。
对于负载均衡环境,多服务器内存中缓存数据的话,需要解决的一个很重要的问题就是一旦数据库中数据有更新,怎么让缓存的数据立即更新? 如果可以容忍延迟或是差异性的话,可以考虑缓存的数据有一个过期时间。但是,最好的方式还是采用通知方式,或者说发布订阅方式。
在第一篇文章中已经列出了几种日志的概览: 所有的日志都有一个最终基类,来看看这个类: [DataContract(Namespace = "WcfExtension")] [KnownType(typeof(WcfExceptionInfo))] [KnownType(t...
假设定义了一个服务契约: [ServiceContract(Namespace = "WcfExtension.Services.Interface")] public interface ITestService { [OperationContract] ...
从这次开始在几个方面简单阐述一下实现,集中配置是这个框架很大的一个目的,首先在数据库中会有这么一些表: 其实可以看到这些表的结构,应该是和配置节点中的层次有对应的 1) Service表描述的是服务,主要保存服务行为以及服务的配置。
由于希望使用Wcf作为公司内的通讯框架,因此基于Wcf进行了一些扩展,主要的目的有以下几个方面: 1) 希望减少客户端调用的复杂度,调用方式简化为WcfServiceLocator.Create().Add(1,2)。
对于下面几种方式,哪一种是最合适的,我期望的是这样的: 1) 在客户端,对于TCP确保使用连接池,在每一次使用连接之后归还连接等待复用。由于连接池是宝贵的资源,不可能每一次调用都去创建,而是只创建一次。
从上篇的图中可以猜测到还会有Redis 2.2.1 的测试,相同的测试环境,1K的数据量,使用ServiceStack.Redis客户端进行如下测试: 1) Set操作 2) Get操作 3) Del操作 每一套测试分别使用三个配置进行测试: 1) 绿色线条的是开启Dump方式的持久化,5...
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 (使用的是官方C#客户端的InsertBatch),这个测的是批量插入性能能有多少提高 3) 安全插入功能 (确保插入成功,使用的是SafeMode.
我们知道TCP连接的代价是比较大的,因此很多时候我们都会使用长连接,对于客户端也就会使用连接池。 而各种客户端实现的方式不尽相同,API的最佳使用方式也不尽相同,如果使用不当则会发生很大的问题。 比如,在每次连接服务端的时候都初始化连接池,每次使用之后释放连接池,那么会导致很可怕的性能问题。
Redis 是一个有趣的项目,与其把它说成键值存储、键值缓存还不如把它说成是一个远程的数据结构。 Redis的项目名是Remote Dictionary Server的缩写,我觉得还不如叫Remote Data Structure Server – Redss 很多人把它和memcached比较,把它和tt比较,我觉得Redis在提供了诸多功能的同时又保证了代码的简洁和实现的简洁,这个很好。
假设有2个机房(测试服务器2/3以及123/124)互为灾备(灾备机房在主机房对外服务时处于待命),应用都只连接自己机房的存储服务(mongodb1.6.5和kt 0.9.28),两个机房之间的存储服务需要相互同步,尝试方案如下: 编号 ...
如果我们记录用户的点击或者鼠标的移动,并且绘制成热点图,生成的结果可以帮助我们分析和改良UI。 用于分析网站UI友好性的点击热点图可以这么来做: 最简单的方式是记录页面地址,鼠标相当于页面左上角的X和Y。
kt: http://fallabs.com/kyototycoon/ 说明: 1) 客户端服务端都是8核,千兆网卡 2) 表格横向是value的数据大小 3) 表格的值是每秒操作数 4) KC创建的是hash库 100B ...
Redis按照官方的定义是一个开源的,高级的键值存储。本文就想扩展开介绍,高级和存储两点。 为什么高级,咱们列一下它的基本特性: 每秒10万+的读,8万+的写(是不是有点吹?) 操作原子性(还支持把一组命令合并为一个原子操作) 多种基元数据类型的支持(hash/list/(sorted)s...
请根据下面的表格,从纵向的列选择你熟悉的知识点(最后两行可以随意列举你感兴趣或熟悉的知识点),从横向的行选择一个知识点的方面构成一个问题。 也就是说你可以选择一个知识点回答其五个方面,也可以选择十个知识点,每一个回答其一方面。
一共有4台机器,各自挂接一个存储,希望实现: 尽量节约存储 高可用性 存储大量数据 配置方案: 每一台机器做一个分片的主数据库 每一台机器做一个分片的后备数据库 每一台机器做一个分片的仲裁服务 两个两个一组交叉作对方的后备 有三台机器开配置服务 有一台机器开路由服务(生产环境可以在每一台Windows App服务器上开路由服务,App服务器集群做负载均衡) 这样的话,任何一台服务器完全离线(或者交叉的两台服务器离线),都能保证整个系统正常运行。
购买链接:http://www.china-pub.com/197209 译者序 做.NET 或是微软平台的架构设计既简单又困难。说简单的理由是,微软提供的产品往往考虑全面,容易上手,并且文档丰富。
测试代码点击这里下载,通过此代码也剖析了MVC2的扩展点和扩展方式(其实在不调用基类的情况下填满所有重写的方法也就完成了大半个MVC框架)。 MVC执行流程如下(可以直接下载代码运行页面查看此结果): ----------------开始执行TestMvcApplication 类的 ...
虽然linq2sql 不是什么新技术,但是这个ppt附带的例子我花了2周时间来准备 覆盖了linq2sql使用/特性的方方面面,可以算是一个例子大全,提供给大家作为学习的材料 Training ii:linq2sql View more presentations from powerzhuye.
上次我发了一个帖子,讨论了几种前端的实现方式,在此文中想针对模板方式进行一些补充。 其实说白了,这么多方式可以分为两类,一种是HTML在客户端组装,一种是HTML在服务端组装。 那么模板引擎也可以分成两类: 1) 客户端模板引擎,比如jtemplate。
今天接到一个临时任务,排查一个网站的诡异问题,是这样的,这个网站访问量很大,上了一个模块,在页面服务端发出一个http请求,读取另一个java网站提供的数据,上线之后发现一旦存在并发,或是比较多的访问,http请求就会失败,甚至在服务器上不能打开任何页面,但是服务器可以被ping通,也可以ping通其它网址(我没有看到真实的情况,只是听说有这样一个情况)。
对于前端页面和后端代码的分离,ASP.NET WEBFORM和ASP.NET MVC都在不同方面做了努力。 在这里提出一些自己初步的设想,只是初步的设想,对各种质量特性并没有经过验证,就不放首页了。 我们的目的是: 1)产品或美工负责页面布局、样式以及基本的交互行为(不依赖业务逻辑的交互)。
Training i:.net 3.5 & c# 3.0 & linq View more presentations from powerzhuye. 代码下载地址:http://files.
demo地址:ServerAutoUpdate.rar 测试步骤: 1) 安装ServerAutoUpdate.Server这个Windows服务,修改配置文件中Web服务地址为ServerAutoUpdate.
http://files.cnblogs.com/lovecindywang/%e6%b5%85%e8%b0%88%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e4%b8%ad%e7%bc%93%e5%ad%98%e7%9a%84%e5%ba%94%e7%94%a8.
最新版本改进了以下几点: ResourceMerge.rar 1) 增加了PreOptTool在上线之前进行脚本样式压缩,并且增加头尾标识/*begin*/和/*end*/ 2) 增加头尾标识的目的是因为发现如果引用的资源是网络资源(比如从CDN获取)的话在网络不稳定的时候会出现文件下载不完整,通过头尾标识可以判断文件是否完整,不完整重试2次,配置文件配置: 3) 对于负载均衡环境,action=info观察合并情况出现乱跳,统一使用memcache保存这些信息。
发现有一个服务占用大量的内存 奇怪的是服务一开始的时候只占用100M左右内存,随着时间推移越来越大,最后导致服务器内存吃紧。这可以算是一种内存泄漏的问题,之所以标题不说是内存泄漏,最后就会知道,并不是因为什么东西没回收导致内存泄漏。
之前的文章中我们介绍了如何在.NET下运用相关类库进行多线程编程的基础,我们知道.NET 4.0已经正式推出了,带来的重要特性是并行库。本文就谈谈对并行计算的一些理解和看法。并行计算不是一个很新的概念,其实它就是通过多线程把同一个任务分割成多个子任务并行的执行的过程。
先说说自己对Memcache和Mongodb的一些看法,主要是抛砖引玉了,希望看到大家的意见和补充。 Memcache Memcache的优势我觉得总结下来主要体现在: 1) 分布式。
mongodb是一款文档型的非关系型数据库,性能非常高,老赵做过相关测试,我测试下来也差不多,和sql server相比,写入性能好太多了,下面是我的测试结果: 一条记录4K,1000万的数据占50G磁盘包括索引 Document doc = new Document(); doc.
背景 站点经过几年的积累,一个页面上需要加载数十个脚本和样式文件(之后我们把脚本和样式统称为静态资源),在浏览器没有缓存的情况下如此之多的请求数不但会对服务器有比较大的压力(这个问题可以通过CDN或反向代理解决),而且页面呈现也会非常慢(我们知道脚本的下载会阻塞其它资源下载以及页面呈现)。
谈谈最近优化一个网站项目的经验,首先说一下背景情况: 1) 在页面后台代码中我们把页面上大部分的HTML都使用字符串来拼接生成然后直接赋值给LiteralControl。 2) 网站CPU很高,基本都在80%左右,即使使用了StringBuilder来拼接字符串性能也不理想。
线程同步的问题 1) 我们必须找到代码中所有可能被多个线程同时访问的资源,然后使用线程同步来保护资源,并且我们没有办法来验证是不是正确进行了线程同步,包括是否有遗漏和是否对不需要同步的资源进行同步。 2) 线程同步是有损性能的,如果某个操作大量执行,并且这个操作原先的执行时间非常短,那么如果我们对这段操作前后进行锁的申请和释放的话性能可能下降一个数量级。
上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是Thread(ThreadPool)+信号量+锁+Control.Invoke。.NET的异步编程模型给我们提供了一种基于IAsyncResult的编程模式,它尤其适用于处理下面的应用场景: 1) 被阻止,正在等待...
谈多线程谈到现在,我们要明确多线程的一个好处是可以进行并行的运算(充分利用多核处理器,对于桌面应用程序来说就更重要一点了,没有WEB服务器,利用多核只能靠自己),还有一个好处就是异步操作,就是我们可以让某个长时间的操作独立运行,不妨碍主线程继续进行一些计算,然后异步的去返回结果(也可以不返回)。
在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI线程上操作控件,否则很容易产生人品问题。可以想到,上次介绍的两个Timer基于ThreadPool,回调方法运行于不同于UI线程的新线程上,在这个方法中操作控件需要进行Invoke或BeginInvoke。
首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下: Thread.Sleep(1000); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append("test"); string s = sb.ToString(); textBox1.Text = s; 首先我们可以把这个操作理解为一个非常耗时的操作,它至少占用1秒的时间。
浅谈.NET下的多线程和并行计算(一)前言 浅谈.NET下的多线程和并行计算(二)线程基本知识 浅谈.NET下的多线程和并行计算(三)线程同步基础上 浅谈.NET下的多线程和并行计算(四)线程同步基础下 浅谈.
在多线程应用中我们有一些很常见的需求,比如定时去做计划任务,或者是在执行一个长时间的任务,在执行这个任务的过程中能有进度显示(能想到要实现这个需求需要新开一个线程,避免阻塞UI的更新)。对于这些应用.NET提供了现成的组件。
这节我们按照线程池的核心思想来自定义一个简单的线程池: 1) 池中使用的线程不少于一定数量,不多于一定数量 2) 池中线程不够的时候创建,富裕的时候收回 3) 任务排队,没有可用线程时,任务等待 我们的目的只是实现这些“需求”,不去考虑性能(比如等待一段时间再去创建新的线程等策略)以及特殊的处理(异常),在实现这个需求的过程中我们也回顾了线程以及线程同步的基本概念。
池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器中放置一些资源,在用的时候去拿,在不够的时候添点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。
回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore。这些用于线程同步的结构叫做同步基元。同步基元从类型上可以分为锁定/通知/联锁三种。
其实,如果线程都是很独立的,不涉及到任何资源访问的,那么这些毫无干扰的线程不会产生什么问题。但是在实际应用中我们的线程总是涉及到资源访问的,而且往往涉及到共享资源的访问,那么就产生了线程同步的问题。一直觉得线程同步这个名词很奇怪,字面上看同步就是使得步调一致,线程同步是不是就是让线程步调一致的访问资源呢?事实上反了,线程同步恰巧是让线程不同时去访问资源而是去按照我们期望的顺序依次访问资源(是同步资源访问的行为而不是同步同时访问资源)。
首先来看看如何创建线程: Console.WriteLine(Process.GetCurrentProcess().Threads.Count); Thread t1 = new Thread(() => { Thread.
作为一个ASP.NET开发人员,在之前的开发经历中接触多线程编程的机会并不是很多,但是随着.NET 4.0的发布临近,我越来越感受到未来的1-2年中并行计算将会有很大的应用。于是决定通过写日志的方式来总结一下.NET 3.5下的多线程编程进而引入.NET 4.0提供的新的并行库以及新的并行编程模式和编程的思维方式。