.net 4.0中出现的几个service的区别和解释

首先说web service的概念。它是一个向外部提供软件内部功能的手段。这里的内部外部,可以是一个软件内部组件向另一个组件提供服务,也可以是一个软件整体向另一个软件提供服务,只是那个软件通过RPC调用服务。web service是基于这个思想的。另外 Web service具有行业标准,比如最重要的是数据传输标准,使用XML/SOAP的传输协议。这个协议是在HTTP或者FTP的支持下运行的。之所以有这个标准,是为了让各种不同的实现web service的技术能够相互通信。因为web service出现的前夜,各技术使用的通信协议很不一样,比如有DCOM, RMI, CORBA,乱得一团糟。使用统一的XML就解决了这个问题。

.net开发中可能会遇到以下一些service,概念是容易搞混的

  • Web Service:出现于.net 2.0时代。它提供一个很普通web service。用asp.net及相关技术实现。但它有很多缺陷,主要体现在安全性方面,没有提供授权、验证之类的架构。第三方是可以篡改消息中的内容的。对电子商务网站来说很不可靠。
    • WCF Service:出现于.net 3.0时代,它的具体实现据说也是用的2.0的代码。它完全能够替代Web Service,在Web Service基础上,它在安全性、分布式管理啊等方面有很大提高。它的实际意思是WCF RIA Service。之所以有RIA在里面,和微软提出的MVVM的架构有不小的关系。WCF RIA Service看起来很像是为这个架构量身定做的。顺便提下,在也许是VS2010刚发布的一些版本中,WCF RIA service显示为.Net RIA Service。如果你打过补丁,这个名字就应该被替换掉了
    • Domain Service:它是向外界暴露DAL(Data Access Layer)的一个WCF Service,就算是特殊的WCF Service吧。因为真正的WCF Service一般都是暴露BLL(Business Logic Layer)或者称为BCL(Business Control Layer)的功能。另外提一下的是,最近我在做Silverlight的开发。里面用到了MVVM的架构,向V层提供本地的M层的服务,通过domain service实现是个很常见的方式。
    • WCF Data Service:它也是向外界暴露DAL的,但是它支持REST这种架构理念。在传输使用的数据格式上没有太多限制,XML和JSON都支持。它的前身是ADO.Net Data Service。大家都知道ADO.Net entity framework。ADO.Net Data Service就是把EF封装成服务给外界去用,但ADOEF是不支持REST的。

这里有个WCF的结构图

这下算把这几个confusing的概念理出来了。

推荐参考:

1. http://forums.silverlight.net/forums/p/228959/556599.aspx

2. WCF REST vs. ADO.NET Data Services, http://stackoverflow.com/questions/334639/wcf-rest-vs-ado-net-data-services

3. WCF, Data Services and RIA Services Alignment Questions and Answers, http://blogs.msdn.com/b/endpoint/archive/2010/01/04/wcf-data-services-ria-services-alignment-questions-and-answers.aspx

你真正了解LWN图书馆的CS分馆吗?

只是跟大家分享一下LWN到底有哪些关于CS技术方面的书,学术方面的我就不管了。走到自己专业的书架前,别人问起这本书是关于啥的,如果你连书名都看不懂,总不应该吧?

下面这些Keywords,有关于软件的,有的是技术,有的是工具,有的是协议,杂七杂八的什么都有。我大致(大致!)地分了个类,随手做了点注释,分类分得不好也就别挑我的毛病了。也就是说,这些资料LWN都有,我们多多去refer。

- Windows相关


    – Powershell, DCOM, Active Directory, WMI, IIS, ISAPI
   

- Microsoft相关


    – F#, Silverlight(RIA工具), LINQ, NHibernate, Webmatrix, Avalon, Atlas, WPF, WCF, IronPython(.net下的python), ForeFront, BizTalk, CardSpace, Sharepoint, Expression(页面设计工具), DotNetNuke(CMS框架)
   

- Java相关


    - 工具


        Ant(编译打包工具), Maven2(团队协作工具), Cargo(部署工具), CVS, svnserve, CruiseControl(持续集成工具), LuntBuild(持续集成构建), Cobertura(代码覆盖率检查), Hudson(持续集成工具), Openfire(Jive Messenger), JUnit(开源测试框架), TestNG(测试框架), DBUnit(基于JUnit的扩展框架,专用数据库测试), JUnitPref, JMeter(压力测试工具,来自Apache), SoapUI(测试,测试网站负载能力), FEST(测试), PMD(静态分析工具), FindBugs(静态分析工具), Jupiter(用于Code review), Mylyn(任务管理), QALab, Bugzilla, iReport(Report生成), JesperReport(Report生成), Log4j, BIRT(给Eclipse的Reporting tool)


    – 语言


        AspectJ, JRuby, JavaFX,POJO(Plain old java object),Groovy(一种用java写的语言)

    – 框架


        Tapestry(Apache的MVC框架),Jini,Geronimo(又一个Apache框架),DWR,SEAM(Java下做RIA的)


    – Other

         JBoss
   

- C/C++

    – Qt, STL,  C++/CLI, ANSI C++, ATL(Active Template Library)


- Mac OS相关


      – AppleScript, Mono(Linux下的.net工具)
   


- Linux相关(大多是操作系统)


      – Samba, Solaris, CentOS, FreeBSD, OpenSUSE, KDE, SELinux


- Adobe技术相关

    – Air, Flex, Cairngorm(网络前台), BlazeDS, ColdFusion(Web工具)
   

- Other Framework(不管是干嘛的framework都放进来了)


    – Javascript


        – Prototype, jQuery

    – Other


        Grails(Groovy framework), Stellent, Pylons(Python的web framework), Django(Python的web framework), CodeIgniter(php web frameword), Joomla!(一个CMS), Drupal(一个CMS)
        
       

- Other Language Related


    – AOP(Aspect oriented programming), Ruby, Ruby on Rails, wxPython, Prolog, Latex, Delphi
   

- Graphics


    RenderMonkey, OpenGL, Blender, SIO2
   

- Software Engineering

    – Refactoring(著名的重构概念), TSP, PSP, Scrum, SOA


- Database

    TOAD, Perl DBI, SQLite, COBRA, PostgreSQL, BerkeleyDB(跟伯克利没啥关系)
   

- Other Web related


    XSLT, TCL/TK, WebDAV(一种通信协议), MAPI, LDAP(有时候看到最后的P都猜到是啥了), RIA, E4X, Laszlo, RESTFul, GWT, Nagios(网络监控工具)
   

- Other


    – MythTV, ABAP, Brownfield, OS/2, K2 Blackpearl, ArcView, SlickEdit(一款很贵的IDE), TinyOS, PGP, Citrix公司, Sybase, SEO, WebSphere, Wikis, SAP, HaXe(一个编程语言), Neko(一个编程语言)
   

已保护:5月18-19日 技术交流会总结

这篇日志已被密码保护。请在这里输入密码:

SQL Server 2008 下 18456错误的解决办法

这个错误是在用SQLServer authentication登录SQLServer时产生的。Windows authentication错误的朋友们就不用往下看了。

网上给的很多办法都无法解决,其中一个原因是,没有注意在错误信息中还有State一项。

很多人会觉得,我遇到的State是1啊?为什么解决不了。今天在MSDN的一篇博客上看到说 message is kept fairly nondescript to prevent information disclosure to unauthenticated clients. The ‘State’ will always be shown to be ’1′ regardless of the nature of the problem.  意思就是说对于非认证用户,错误信息中的state将总是1。所以,需要用Windows authentication登录SQLServer,在Management|SQL Server Logs下,去查一下错误信息。这一次我看到的错误状态58。这个数在刚才的出错信息中是不会显示的。这就是为什么很多人查到的针对state=1的解决办法无法使用的原因。那么58表明我犯了个很弱的问题,就是要把Server设置为支持Window和SQLServer双认证方式。设置完后重启数据库服务器。

后续还遇到一个问题,VS通过SQL用户连接数据库时,出现 The SELECT permission was denied on the object ‘sysobjects’, database ‘mysqlsystemresource’, schema ‘sys’.的错误。mysqlsystemresource是SQL Server中一个系统隐藏数据库,public schema下的用户无法在里面使用SELECT。只需要把登录数据库的用户名的schema改到更高级别就可以了。

Facebook的网站架构

最近读了一片文章,觉得值得精读一下。原文在这里:

http://www.quora.com/What-is-Facebooks-architecture

前端

大家都知道Facebook的网页是由php写出来的。实际上Facebook上有一个神秘的Hiphop项目,它负责把php代码转成C++。这样能优化php。Hiphop这个项目的负责人是北大1987届遗传与分子生物专业毕业生,普林斯顿CS博士赵海平。Hiphop为Facebook的服务器减少了50%的CPU使用率。Facebook曾经尝试了很多办法优化网站,甚至重写了Zend引擎,并且提交给了PHP项目,但都没能达到目标,后来才选择了Hiphop。Hiphop的原理是,在php转C++的过程中实现了三步操作:静态分析(分析依赖关系)->类型推演(选择合适的C++变量类型)->代码生成。此项目总共30万行代码,在google groups上有讨论。http://groups.google.com/group/hiphop-php-dev

Facebook在Http在传输时使用了BigPipe。有兴趣的同学可以去查查这方面的资料。简单的说它是一个Web服务器和浏览器之间建立的一种不同传统http模式的传输方式。网上普遍用的加速方法有延迟javascript的加载或者并行下载等方式。BigPipe当然也有并行的思想。它最重要的地方是调整了一些请求的发送顺序,实现了网页加载的加速。当Web服务器挣在生成页面时,此时的浏览器正处于闲置状态。如何让Web服务器产生时间和浏览器的Rendering时间重合呢?BigPipe采用的是分解页面的办法。不多说了。

Facebook使用了Varnish Cache实现的反向代理服务器技术。普通的代理服务器技术是,客户手动配置Proxy,把请求发给Proxy,由Proxy转发给Web服务器。Web服务器并没有配置和使用这个Proxy。反向代理服务器的最大不同是,Web服务器配置了这个Proxy,而用户没有配置它。比如当Facebook用户把请求发给一个IP地址时,以为发给了Facebook的服务器,其实可能只是发给了Facebook的Proxy。这个Proxy负责把请求发给Facebook的内部服务器组。这样黑客如果黑这个IP,其实对Facebook影响不大,因为数据并不在Proxy上面。Varnish Cache的开发者是丹麦人Kamp,他也是FreeBSD的内核开发者之一。

在Operating Systems Design and Implementation 2010上有一篇论文,讲了Facebook所使用的Haystack图片存储系统。Facebook目前有260Billion张图片,总共20PB,平均每张800KB,并且数据量还在以每周60TB的速度增长。Haystack的使用动机解释起来有点复杂。主要原理是让多个逻辑文件共享一个物理文件。就好像是非常多的图片文件和并称了一个大文件,这个文件格式是Facebook自行设计的,再在里面搞些Indexing。搜索图片时,实际上用的又是它自行设计的查找算法,这样完全绕过了操作系统的文件查找算法。在Google论文中搜索Finding a needle in Haystack: Facebook’s photo storage可以查到更多资料。

业务逻辑层

这一层是Facebook自己的核心项目Thrift,后来开源了。它的主要目的是实现各种不同编程语言间的相互通信,包括C++、Java、python、ruby、C#、erlang、cocoa、php等等。这些语言之间通过XML或者JSON来传递数据。Apache已经将Thrift列入孵化器项目中了。请见 http://incubator.apache.org/thrift。据说是Facebook觉得tomcat服务器太重量级了,所以他们用Java些的Services都没有架在公开的服务器框架上,而是只供Thrift使用。

数据访问层

这是所谓的持久化操作,由MySQLMemcached、Facebook自己的Cassandra、Hadoop的HBase一同完成。

Memcached是一套高效的分布式内存缓存框架,它能减少对象读取数据库的次数。作者Anatoly Vorobey是以色列理工大学毕业的,年纪也不小了。另一名作者是华盛顿大学毕业的Brad Fitzpatrick。他的成名作其实是LiveJournal。

Cassandra是一个非关系型数据库,也是Facebook自己开发的,现在开源了。它是一个分布式的数据库系统,而不是一个单纯的数据库。对于一个分布式数据库进行一次读写,这条命令会被路由到所有的数据库节点上去。Cassandra具有很好的扩展性和稳定性,这对Facebook来说是极其重要的。

HBase是Apache Hadoop项目的一个子项目。Hadoop项目本身是提供分布式计算的。这里说的是计算,主要功能不是上面的数据库存储。HBase是基于Hadoop之上做的一个分布式数据库,其名字表明它就是Hadoop Database的意思,主要实现分布式储存。理论基础来自于Chang et al所写的Goole论文Bigtable。现在普遍认为HBase是Bigtable的开源实现(因为Google自己还实现了一套Bigtable)。

Facebook的工程师说他们正在减少Cassadra的使用,因为他们更喜欢HBase,因为那个更简单好用。

硬件

最近炒得很火热的Facebook在俄勒冈州的新数据中心,有超过60000台服务器。当然和Google一样,这些服务器都是自己设计的。这个数据中心将支持Facebook提出的Open Compute项目。很多人对这个项目进行很多有趣的评论。因为对于Google和Amazon来说,他们的数据中心技术是严格保密的。Facebook竟然公开了类似的顶尖技术,就好像跟Google示威说,以后人人都能学会如何搭建这样的Web数据中心。

稍微娱乐一下。

一是今天看到了一张图,是由Facebook的一个实习生Paul Butler制作的。他把Facebook的5亿用户的用户关系还出来了。是哪里一片漆黑了呢?
点击查看原图,3.8M高清
二是,据说在Google Images上搜索cstring会有意想不到的结果。我感到很抱歉,为什么会这样?

一些参考资料:

http://www.facebook.com/notes.php?id=9445547199

http://www.infoq.com/presentations/Facebook-Software-Stack

加关注

Get every new post delivered to your Inbox.