最新评论

共3页: 1 2 3 下一页 
greatghoul 2012-02-06 14:26
写的很好,很细腻。
ζ浮云¢惊龙 2012-02-06 09:37
SqlServer之Convert 函数应用 Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06 Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06 Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06 Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06 Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06 Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46 Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06 Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16 Select CONVERT(varchar(100), GETDATE(), 12): 060516 Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937 Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967 Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47 Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157 Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16 Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47 Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250 Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006 Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16 Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006 Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006 Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006 Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006 Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006 Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49 Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006 Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16 Select CONVERT(varchar(100), GETDATE(), 112): 20060516 Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513 Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547 Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49 Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700 Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827 Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM
ζ浮云¢惊龙 2012-01-29 14:28
http://golangwiki.org/wiki/index.php?title=%E5%AE%89%E8%A3%85
ζ浮云¢惊龙 2011-12-30 10:53
http://go-ide.com/ goIDE http://bbs.golang-china.org/index.php http://golang.org/
ζ浮云¢惊龙 2011-12-30 10:38
摘要 Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。 Go语言-简介 Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。 Go是谷歌2009发布的第二款编程语言.2009年7月份,谷歌曾发布了Simple语言,它是用来开发Android应用的一种BASIC语言.   北京时间2010年1月10日,Go语言摘得了TIOBE公布的2009年年度大奖。该奖项授予在2009年市场份额增长最多的编程语言。   谷歌资深软件工 程师罗布?派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率.”派克表示,和今天的C++或C一样,Go是一种系统语言.他解释道,“使用它可以进行快速开 发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大.”   2007年,谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%, 投入在该项目上.除了派克外,该项目的成员还其它一些谷歌工程师.   派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言.   现有编程语言均未专门对多核处理器进行优化.派克表示,Go就是谷歌工程师为这类程序编写的一种语言.它不是针对编程初学者设计的,但学习使用它也不是非常困难.Go支持面向对象,而且具有真正的封装(closures)和反射 (reflection)等功能.   在学习曲线方面,派克认为Go与Java类似,对于Java开发者来说,应该能够轻松学会 Go.   之所以将Go作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如 Eclipse IDE中的插件.目前还没有支持Go的IDE.   在目前谷歌公开发布的所有网络应用中,均没有使用Go.但是谷歌已经使用该语言开发了几个内部项目.   派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,现在还言之尚早,不过Go的确可以和Native Client配合使用.他表示,“Go可以让应用完美的运行在浏览器内.”例如,使用Go可以更高效的实现Wave,无论是在前端还是后台.   Go 同时具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x86和32位x86计算机的一套编译器(6g和8g).谷歌目前正在研发其对ARM芯片和Android设备的支持.派克表示,“Android手机存在的问题是,我们一直没有一个数字协处理器.” Go语言-目标 Go的目标是希望提升现有编程语言对程序库等依赖性(dependency)的管理,这些软件元素会被应用程序反复调用。由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。 谷歌大约2007年开始开发Go,并于2008年投入了一组全职员工。谷歌当初将该语言设计为一款系统编程语言,可以被用于网络服务器、存储系统和数据库中。但是谷歌认为,该语言还有望被用于其它领域。 Go语言-应用 由于Go尚未成熟,因此谷歌旗下各类面向用户的服务或应用都没有采用该语言。正因如此,谷歌才需要外部编程人员的协助。 派克说:我们需要更好的程序库和工具,而开源社区能够在这些方面为我们提供很大的帮助。 通过创建新的编程语言,谷歌将继续拓展计算领域的各个方面,从而促进这些领域的发展。这同样也是谷歌开发Android操作系统、Chrome浏览器和Chrome OS的动机所在。 北京时间2010年1月10日,Go语言摘得了TIOBE公布的2009年年度大奖。该奖项授予在2009年市场份额增长最多的编程语言。 Go语言-Go团队成员 Thompson,1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。   Pike,曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。   Robert Griesemer,曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。   此外还有Plan 9开发者Russ Cox,和曾改善目前广泛使用之开原码编译器GCC的Ian Taylor。 Go语言-Go可以干嘛?  Google对Go寄予厚望。其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决若干物件取向程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎但重要的内存管理问题。Go的速度也非常快,几乎和C或C++程序一样快,且能够快速制作程序。   Go的网站就是用Go所建立,但Google有更大的野心。该软件是专为构建服务器软件所设计(如Google的Gmail)。Google认为Go还可应用到其他领域,包括在浏览器内执行软件,取代目前JavaScript的角色。   Pike说:它至少在强度上比JavaScript高一级。Google自建Chrome浏览器,部分原因就是加速JavaScript和网页表现,而Google已经融合了本身的技术,如Native Client和Gears。   Pike表示,Go另一项与网络相关的特色,是服务器和用户端设备,如PC或手机,可以分担工作。因此,使用Go的服务便可轻松适应不同的用户端处理性能。Go也可解决目前的一大挑战:多核心处理器。一般电脑程序通常依序执行,一次进行一项工作,但多核心处理器更适合同步处理许多工作。Pike说:我们自认有足够的支持,可改善这方面的问题。   Go团队正在寻求帮助。其中一个重要领域是改善Go能够使用的runtime library。这类library可提供许多工具和功能,加快程序设计的过程。而Go的library还包括许多重要的设计元素,并供应处理同作、垃圾收集和其他低层杂务的资源。   Go团队也需要编译器方面的协助。Thompson曾为32位元和64位元x86处理器,及 ARM处理器写过一些编译器,Taylor也为GCC编译器写过一个Go前端。   尽管Google对Go有很大的野心,该公司也明白,这项计划无法完全取代现有的技术。 Pike说:我不认为我们能取代任何东西。我们只是创造出这个领域的另一个角色。 Go语言-Go语言的特色 简洁 快速 安全 并行 有趣 开源 支持泛型编程,内存管理,数组安全,编译迅速
ζ浮云¢惊龙 2010-12-02 00:13
http://tweetview.net/hashTag/nosql nosql 看完了,思考,思考完了,再看
ζ浮云¢惊龙 2010-12-02 00:11
什么时候该使用NoSQL存储数据库? What NoSQL Store Should I Use? The Right Tool for Your Use Case | Architects Zone 文章总结以下几点: 1.频繁写,很少读统计数据,比如点击率,应该使用基于内存的in-memory的key/value存储数据库如Redis, 或者update-in-place 文本存储如MongoDB. 2.大数据Big Data (如天气数据 业务分析数据) 可以使用分布式数据库系统如Hadoop. 3.二进制数据(如MP3s 和PDFs文档) ,直接存储直接发送给客户端浏览器,如Amazon S3. 4.短暂数据 (如web sessions, 锁状态, 短生命周期状态) 可以保存在如Memcache. (banq:其实就是内存中in-memory) 5.如果你需要在多个节点复制数据(比如在web应用和移动设备之间同步音乐数据库), 可以使用复制特性如CouchDB. 6.高可用性应用, 高严格要求当机时间,甚至是零当机。自动集群, 冗余数据库,如Casandra 和 Riak.
ζ浮云¢惊龙 2010-12-02 00:10
NoSQL and Data Warehousing | Architects Zone 数据仓库是将从多个不同来源的数据结合成一个综合且易于操作的数据库,访问数据仓库系统普通方式是查询,分析和报告。 所以,这个最终结合成的数据库是有可能选择NoSQL,如Hive,作者给出了一个用作数据仓库分析的数据库选择策略: 对于数据仓库,他认为关系或/ OLAP类型有显著优点,主要是因为可以允许用户通过SQL直接遍历操作数据,而当你的数据量变得很大时(banq:如果不大也没必要搞数据仓库吧?) 你也许要考虑限制用户的这种自由,使用NoSQL。有利有弊吧。
ζ浮云¢惊龙 2010-12-02 00:04
分布式领域CAP理论, Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容错性) 可靠性 定理:任何分布式系统只可同时满足二点,没法三者兼顾。 忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。 关系数据库的ACID模型拥有 高一致性 + 可靠性 丧失可用性: Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。 Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。 Isolation隔离层. 事务将假定只有它自己在操作数据库,彼此不知晓。 Durability. 一旦事务完成,就不能返回。 跨数据库事务:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的,JavaEE中的JTA事务可以支持2PC。因为2PC是反模式,尽量不要使用2PC,使用BASE来回避。 BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性: Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库) Soft state软状态 状态可以有一段时间不同步,异步。 Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时高一致。 BASE思想的主要实现有 1.按功能划分数据库 2.sharding碎片 BASE思想主要强调基本的可用性,如果你需要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。 现在NoSQL运动丰富了拓展了BASE思想,可按照具体情况定制特别方案,比如忽视一致性,获得高可用性等等,NOSQL应该有下面两个流派: 1. Key-Value存储,如Amaze Dynamo等,可根据CAP三原则灵活选择不同倾向的数据库产品。 2. 领域模型 + 分布式缓存 + 存储 (Qi4j和NoSQL运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。 这两者共同点:都是关系数据库SQL以外的可选方案,逻辑随着数据分布,任何模型都可以自己持久化,将数据处理和数据存储分离,将读和写分离,存储可以是异步或同步,取决于对一致性的要求程度。 不同点:NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX,可以适合非Java如PHP RUBY等领域,是一种可以拿来就用的产品,而领域模型 + 分布式缓存 + 存储是一种复杂的架构解决方案,不是产品,但这种方式更灵活,更应该是架构师必须掌握的。
ζ浮云¢惊龙 2010-12-02 00:03
CAP为什么不能同时达到呢? 2010年05月17日 23:54 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题 顶一下 http://lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf 这是证明CAP理论的论文.. 简化版本, 看下面这一篇. http://www.julianbrowne.com/article/viewer/brewers-cap-theorem 传统的数据大部分都不是分布式环境下的, 自然不会遭遇这个问题.. C- Consistency 保证数据的一致性,一旦数据commit,所有的人都可以看到一致的数据. A- Availability 数据始终可访问. P- Partition tolerance 哪怕在出现网络分隔的情况下, 系统也可以正常运转.
ζ浮云¢惊龙 2010-12-02 00:02
http://natishalom.typepad.com/nati_shaloms_blog/2008/03/scaling-out-mys.html
ζ浮云¢惊龙 2010-12-02 00:01
忘记贴原文了: Scaling with mysql
ζ浮云¢惊龙 2010-12-02 00:01
我很喜欢“Social Media kills the RDBMS社交媒体杀死了关系数据库”这句。这篇文章也值得一看。 社会媒体(或称社交媒体)是一场革命,facebook twitter Hulu都是先驱,现在国内中央电视台等传统媒体纷纷开通网络电视,表示他们对社会媒体的重视。 程序员做软件时,必须对自己软件行业进行分类,是企业软件?还是社交媒体软件? 当然,这个界限越来越模糊,特别是我们知道他们区别的背后本质:CAP定律。
ζ浮云¢惊龙 2010-12-01 23:59
说到伸缩性,我们一般都会想到存储的伸缩以及本身应用程序的伸缩,下面这篇文章讲解了对传统的关系数据的伸缩以及如何通过内存数据网格来进行应用程序的伸缩。 首先对于传统的RDBMS的伸缩,大家比较熟悉主要有以下两种方式: Database replication:这也是经典的Master/salve模式的实现,这种方式最大的优点就是通过增加savle来进行read操作的负责均衡,是一种对read的scale out方式,但是同时这种方式也存在以下的缺点: 1 只是适合于read 频繁的情况,Database replication方式通过多个replica 来对read进行伸缩,但是对于write操作则不能进行scale out. 2 性能问题,因为数据库操作是一种磁盘io操作 3 一致性(consistence),关于这个问题,如果深入讨论可以独立写一篇文章来进行讨论,这里简短的说一下,Master/savle中,如果采用异步复制,那么不同的节点的状态可能是不一致的,相反的如果采用同步方式,那么又会造成很大的延迟。 4 容量问题,复制(replication)技术要求每个节点保存完整的数据,这就带来了两个问题,第一个问题就是对于每个节点来说,数据还是会变得越来越多,这样查询的速度也会相应的变慢,第二个问题就是我们需要提供N+1倍的存储空间。 5 复杂性以及非标准化问题,大多数的数据库复制技术都是相对复杂的,同时不同的厂商所采用的方式也是不一样的,这样就会造成应用和存储的依赖性。 Datebase partitioning:这种方式也就是大家熟悉的数据库sharding技术,这种方式使得数据库中数据分布在多个节点上面,这样每个节点都存储一部分数据,这样的好处就是可以对read和writer操作都具有一定的scale out,但是同样这种方式也存在以下的缺点: 1 要求应用程序的数据必须是能很容易切分的。 2 性能问题,因为数据库操作是磁盘IO。 3 要求改变数据模型,很多的数据sharding技术都要求应用程序知道数据在哪一个partition上面。 4 需要改变应用程序代码 5 静态性,在许多的数据库实现中,当增加Partition的时候,都要求重新的划分partition.相反的目前流行的key-value存储系统通过consistent hashing解决了这个问题。 6 复杂性以及非标准的 前面是针对传统的数据库对scalability的解决方案,下面作者指出了如何通过内存数据网格(In-memory date grids)来进行应用程序的scale out. 在说IMDG之前,作者也指出了目前很多互联网公司采用的方式:通过内存缓存来scale out应用程序,目前比较经典的做法就是在DB前端引入分布式的缓存系统(memcached,terracotta等),这样可以对大部分的读取操作进行非常有效的scale out,但是此种方案还是没有解决对write操作的scale out。 下面就说说IMDG对scale out的解决方案。 作者指出了Paas(Persistence as a service)的说法,说白了就是将对象和数据的持久化仅仅当做是一种服务而已,以下作者以问答的方式阐述了几个常见的问题。 1 Paas如何工作 利用Paas,IMDG将会屏蔽到数据库,内存IMDG和底层数据库的同步操作由IMDG来完成,这种内存和数据库的同步可以通过异步的方式来进行。 2 Paas和RDBMS相比是如何提供性能的 2.1 Paas依赖内存来存储系统的状态,而内存操作和磁盘IO操作来比是非常快速的,同时也支持更大的并发访问。 2.2 因为是内存存储,所以数据访问通过内存引用或者指针,而不需要序列化的开销。 2.3 数据操作直接针对内存对象 2.4 减低了竞争条件,这种方式是将数据分配到多个内存节点上。 2.5 并行的聚合查询,这种方式非常类似Map-reduce并行计算模型,它是一种将计算移动到存储数据的节点进行并行计算的方式,这样将会更好的利用CPU和内存资源 2.6 避免了ORM,读取操作直接从内存进行,避免了ORM的开销,ORM只是在初始化的时候进行。 3 如果要同步数据库,那么此种解决方案不会受到数据性能的影响吗? 不会,原因如下: 3.1 数据以批量的方式异步的同步到数据库。 3.2 更新操作是可以在多个Partition节点并行的进行 3.3 更新操作发生在和需要更新的数据在同一台物理机器上面,这样避免了网络开销. 3.4 我们不是为了高可用性的目的来使用RDBMS的,RDBMS是一个强一致性,低可用性的解决方案(CAP理论), 采用IMDG所有的查询操作都是直接的内存操作,而只有update和insert操作才会触发数据库,并且这个时候会以partition的方式,也就是说write操作也是被scale out的操作。 3.5 应用程序和数据库现在是松耦合的,这样更加方便进行优化 4 异步的同步IMDG和数据库是不是意味着当失败发生的时候,数据可能会丢失? IMDG会进行backup,当一个节点发生失败的时候,备份节点会接着进行,所以不会失败。 5 如果其中一个内存节点失败会发生什么问题? 这个问题非常类似于hadoop的Namenode和datenode节点模型,熟悉hadoop的朋友应该能容易理解。 6 如果数据失败会发生什么问题? IMDG会保留一个记录所有更新和插入的日志,当数据库失败的时候,更新和插入操作还会继续,不会影响到系统终端用户,当底层数据库再次可用的时候,IMDG会根据日志来同步数据。 7 IMDG怎么处理事务完整性? 大家都知道2PC事务是一种反伸缩性的实践,它使得所有的partition耦合在同一事务当中,目前比较好的做法就是将事务分为几个小的事务,每个小的事务都在单独的partition上面完成,这样即使存在部分partition失败,但是IMDG还是会保证整个系统处于一致性的状态。 下面我发发牢骚。 目前随着互联网的的快速发展,对于一些热门的应用会造成非常大的读写压力,尤其是目前社会化网络使得传统的RDBMS更加受到打击)Social Media kills the RDBMS。 说到伸缩性,我们一般都会想到应用程序本身的伸缩和存储的伸缩,应用的伸缩要求我们对应用程序进行合理的切分,按照功能,按照层的方式进行,而存储的伸缩,传统方式采用复制,sharding等方式,但是这种方式是有很多限制的,限制上面也说了。因此我们如何寻找一种能对read和write都具有scale out的解决方案就成了目前一个难题。幸好,目前NoSQL运动给我们带来了福音,通过分布式的key-value存储系统可以更好的对read和write操作进行scale out. 比如像Twitter这样的应用,它是一个读和写都很频繁的应用,采用传统的解决方案肯定是不行,因此需要一种新的解决方案,这就要求我们吸取NoSQL运动的思想,Twitter每天的有100亿条数据写操作,因此这么频繁的write就需要通过consistent hashing根据用户的ID或者名称来进行均匀的切分,比如hash(userID)%node_number,这样又会造成一个问题,就是读取操作怎么办?因为通过切分,不同的用户被分配到了不同的虚拟节点上面,那么一个Twitter用户想要读取最新Tweet的时候就需要从多个节点进行读取,这个时候就需要利用map-reduce的思想,通过移动运算到存储数据的地方,最后在聚合所有的查询操作(在客户端进行reduce操作. 因此我觉得OO+分布式的存储(key-value)+分布式并行计算(Map-reduce)将会是以后的一个发展方向,当然如果采用这种方式前提是应用数据量大,同时要求应用要能很好的进行切分。
ζ浮云¢惊龙 2010-12-01 23:55
可惜这个对数据仓库的项目没什么可借鉴之处 基于Hadoop的Hive就是非常适合做数据仓库,facebook用来做点击广告分析。
ζ浮云¢惊龙 2010-12-01 23:54
那要是现有的系统用了这些NoSQL数据库,系统的对象模型是不是都要变了啊 如果你一开始就将OO,将对象模型和它的持久化分开,就不要变,这些NoSQL本质上就是内存+持久化。但是如果你一开始面向关系数据库设计模型,那就要变化很大了。
ζ浮云¢惊龙 2010-12-01 23:54
写的不错。 感觉Hypertable和HBase有些类似,Hypertable两者都来自google的bigtable,百度就是使用Hypertable,它是用C写的,HBase是Java的。 有些人认为因为Java的内存模型,好像不是太适合做Bigtable 子类实现,见: What is the difference between Hypertable and HBase? Hypertable不是为支持事务性应用(需要事务机制的应用)设计的,它设计目标是对付高而强的负载系统,它的一个架构优点是当访问量不断增加可以平滑增加服务器,所谓平滑的伸缩性。 HBase被推荐应用于稀疏没有太多关联关系的数据记录,也非常适合版本化的数据,不推荐用来存储大量二进制数据。 更多讨论,可以看看我上面的链接。 架构设计需要从事物外部(通过与其他同类事物比较)和深入事物内部两种方式来进行,实际就是“做什么”和“怎么做”分离,我们经常在不自觉中混淆两者界限,但是如果我们按照这两个步骤去做,事情就变得简单和有条理。
ζ浮云¢惊龙 2010-12-01 23:46
NoSQL数据库异军突起,随着Digg和 sf.net大型应用不断采取NoSQL,NoSQL运动已经蓬勃发展,NoSQL数据库很多,如何对他们分类,以便方便地根据自己应用特色选择不同的NoSQL数据库呢? NoSQL = HVSP 无(传统关系数据库的)join或明显事务的高容量简单处理。 按照数据模型保存性质将当前NoSQL分为四种: 1.Key-value stores键值存储, 保存keys+BLOBs (二进制大对象Binary Large OBjects) 2.Table-oriented 面向表, 主要有Google的BigTable和Cassandra. 3.Document-oriented面向文本, 文本是一种类似XML文档,MongoDB 和 CouchDB 4.Graph-oriented 面向图论. 如Neo4J. NoSQL一般都是分布式数据库,高性能是其特点,因此,数据是如何被分布、复制/碎片以及合成就成为关键,这其中涉及你的应用对数据一致性的要求,见CAP原理,不同一致性处理方式决定不同类型: 1.基本上基于Dynamo. 核心思想就是在多个节点之间获得最终一致性就可以,即使你有时会读到脏数据. 好处是写数据时从来不会阻塞。那种强制性节点一致性,如2PC,两段事务提交将会让你的写关闭停顿,使用Dynamo-like风格你能将数据写到多个节点中,通过一致hashing,然后你可以从这些节点读取数据,返回正确结果给用户。 2.基本基于BigTable. 这种模型中,使用常用方式保持节点充分的一致性。比如同步复制,由数据自己活或数据所在位置来实现一致性,不同产品实现细节不一样。 比如:MongoDB有一个面向文本类型的数据模型, 它采取类似BigTable-like 复制策略;Cassandra有面向表table-like数据模型, 采取的是Dynamo-like风格. 以后应该有数据是如何被持久化保存到磁盘上的区分,不同NoSQL处理策略不一样,有的是写一次保存一次;有的是定期保存,后者性能要好些。 当然,也有按照列记录来划分的,见http://nosql-database.org/
ζ浮云¢惊龙 2010-10-26 17:06
from suds.client import Client def get_NC(usercode, accountcode): url='http://nctest.fineland.cn/uapws/service/messageinfo?wsdl' client = Client(url) ##print client result = client.service.getMessage(usercode,accountcode) return result SUDS
ζ浮云¢惊龙 2010-10-26 16:53
错误代码如下: exceptions.UnicodeEncodeError 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) import sys reload(sys) sys.setdefaultencoding('gb2312')
ζ浮云¢惊龙 2010-10-22 14:03
使网页变灰色,只需要一句 css 代码。使用 css 的滤镜: view plaincopy to clipboardprint? 1. html { filter:Gray; } html { filter:Gray; } 或 view plaincopy to clipboardprint? 1. html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); } html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); } 注:样式加在 body 不能使 Google Adsense 等用 script 输出的内容变灰,加在 html 上则可以。 如果不见效果,可尝试把网页头部的声明改为: view plaincopy to clipboardprint? 1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2. <html xmlns="http://www.w3.org/1999/xhtml"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> 非 IE 浏览器可能无法解释 css 滤镜。 细心的童鞋可能会发现,即使加了上述样式,网页中的 Flash 还是彩色的,这时可以设置其透明即可: <object> 标签可以添加 view plaincopy to clipboardprint? 1. <param name="wmode" value="transparent" /> <param name="wmode" value="transparent" /> <embed> 标签可以设置 view plaincopy to clipboardprint? 1. wmode="transparent"
ζ浮云¢惊龙 2010-10-22 11:39
http://docs.python.org/library/warnings.html import warnings warnings.simplefilter('ignore',DeprecationWarning)
ζ浮云¢惊龙 2010-10-09 01:28
erlang做文件上传下载服务器 python做web前台实现的粘合剂 silverlight做web前台插件开发 .net/java/python开发 webservice服务
ζ浮云¢惊龙 2010-10-09 01:19
http://mochaui.org/demo/ 很不错的一个界面js框架
ζ浮云¢惊龙 2010-10-09 01:02
上文地址 http://www.cnblogs.com/sharpmaster/archive/2008/08/21/1272560.html
ζ浮云¢惊龙 2010-10-09 01:01
使用Python创建Silverlight控件 其实关注Silverlight很久了,只是最初的版本令我很失望,1.0的Silverlight在我看来,就相当于强化版的VML或者SVG而已,多年以前(04年)我一直期待微软能出一个强大的web端插件,能够跟flash竞争,这么久以后,这个东西才逐渐变成现实。 好吧,Silverlight 2有了,尽管它还是beta 版,先玩玩吧。我搞了一个Visual Studio 2008 Express版,装了Web跟C#,竟然都不支持2.0的Silverlight开发,有没有搞错,就是冲着那些控件才来玩SL的,这怎么办。 这可郁闷死我了,于是我只好乖乖装完整版本的Visual Studio 2008,这玩意大得很,我把硬盘空间整理了又整理,勉强弄出一点地盘给它,N久之后终于装完,折腾了半天,那个该死的插件又装不上,搞了好久还是不行,我很生气,算了,不搞它了。 于是我决定不要VS2008了,听说Silverlight 2.0支持动态语言,好,来玩玩。我以前是做JavaScript的,换个吧,我来玩玩Python,于是我就找例子,一找找到了,怎么呢,我来写了: 这里是XAML文件app.xaml <Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="System.Windows.Controls.Canvas" x:Name="Page" Width="400" Height="300"> <TextBlock x:Name="MsgText" Canvas.Top="10" Canvas.Left="10"></TextBlock> <Button x:Name="TestButton" Canvas.Top="40" Canvas.Left="10" Content="Test"></Button> </Canvas> 这里是Python文件app.py from System.Windows import Application from System.Windows.Controls import * from System.Windows.Browser import * class App: def __init__(self): self.scene = Application.Current.LoadRootVisual(Canvas(), "app.xaml") def start(self): self.scene.TestButton.Click += self.TestButton_Click def TestButton_Click(self, sender, eventArgs): self.scene.MsgText.Text = "Hello, world!" App().start() 其他的没什么悬念了,Chiron /d,开始跑,http://localhost:2060/index.htm上出现了效果,一个文本框,一个按钮,点一下按钮,框里面出来一个hello, world! 于是我就很激动,原来是这么好玩的啊,貌似写起来也很简单的哇,那我来搞两个复杂一点的控件。什么控件比较帅呢,我一想,日历吧,这个东西好,那我就开始了,我加了一行 <Calendar x:Name="TestCalendar" Canvas.Top="10" Canvas.Left="10"/> 好了,开始跑,咦,不对,说找不到Calendar这个东西,研究了一下文档,发现这个是包含在System.Windows.Controls.Extended.dll里面,于是我把这个dll拷到app目录下,还是不行,怪啊,这要怎么办呢,到处找了一遍,发现竟然没有有关Python调用SL扩展控件的文章,这可痛苦了。 但是我不甘心,我相信微软不会这么不友好,于是我继续查帮助,咦,Calendar前面要加一个前缀做命名空间,但是XAML头上怎么定义呢,我想了想,实在想不出来,然后我很猥琐地想到了Blend,嘿嘿,我下载了一个,安装,创建项目,然后创建控件,这个时候只有内部控件可以用,然后我在项目上添加引用到SDK目录下的System.Windows.Controls.Extended.dll,于是就可以创建日历了。 我要的可不是这个哦,切换到XAML栏,看到没有,这行代码: xmlns:System_Windows_Controls_Extended="clr-namespace:System.Windows.Controls; assembly=System.Windows.Controls.Extended",原来就是它在起作用呵,于是我照样定义了一遍,仍然不行。。。 这是怎么回事?继续发奋研究文档,终于发现,在Python文件里面也要写东西的,我贴完整代码了哦,app.py import clr clr.AddReference("System.Windows.Controls.Extended") from System.Windows import Application from System.Windows.Controls import * from System.Windows.Browser import * class App: def __init__(self): self.scene = Application.Current.LoadRootVisual(Canvas(), "app.xaml") def start(self): # TODO: replace this with your application start logic self.scene.TestButton.Click += self.TestButton_Click def TestButton_Click(self, sender, eventArgs): HtmlPage.Window.Alert(self.scene.TestCalendar.SelectedDate.ToString()) App().start() 呵呵,看到没有,最开始那两句,它是起作用的关键。下面是app.xaml <Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System_Windows_Controls_Extended="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Extended" x:Class="System.Windows.Controls.Canvas" x:Name="Page" Width="400" Height="300"> <System_Windows_Controls_Extended:Calendar x:Name="TestCalendar" Canvas.Top="10" Canvas.Left="10"/> <Button x:Name="TestButton" Canvas.Top="180" Canvas.Left="10" Content="Test"></Button> </Canvas> 好啦,预览一下,非常帅: 好了,今天的试验到这里结束啦,以后我们再来玩复杂些的。
ζ浮云¢惊龙 2010-10-09 00:55
erlang-python port 程序 作者:pascal4123 把<Programming Erlang>书上第12章那个erlang-c的例子改编了下,把C程序改写成了python程序。在ubuntu8.04 + erlang5.6.5 + python2.5.2上调试通过。 erlang side: example2.erl Erlang代码 -module(example2). -export([start/0, stop/0]). -export([twice/1, sum/2]). start() -> spawn(fun() -> register(example1, self()), process_flag(trap_exit, true), Port = open_port({spawn, "python -u ./example2.py"}, [{packet, 2}]), loop(Port) end). stop() -> example1 ! stop. twice(X) -> call_port({twice, X}). sum(X,Y) -> call_port({sum, X, Y}). call_port(Msg) -> example1 ! {call, self(), Msg}, receive {example1, Result} -> Result end. loop(Port) -> receive {call, Caller, Msg} -> Port ! {self(), {command, encode(Msg)}}, receive {Port, {data, Data}} -> Caller ! {example1, decode(Data)} end, loop(Port); stop -> Port ! {self(), close}, receive {Port, closed} -> exit(normal) end; {'EXIT', Port, Reason} -> exit({port_terminated,Reason}) end. encode({twice, X}) -> [1, X]; encode({sum, X, Y}) -> [2, X, Y]. decode([Int]) -> Int. -module(example2). -export([start/0, stop/0]). -export([twice/1, sum/2]). start() -> spawn(fun() -> register(example1, self()), process_flag(trap_exit, true), Port = open_port({spawn, "python -u ./example2.py"}, [{packet, 2}]), loop(Port) end). stop() -> example1 ! stop. twice(X) -> call_port({twice, X}). sum(X,Y) -> call_port({sum, X, Y}). call_port(Msg) -> example1 ! {call, self(), Msg}, receive {example1, Result} -> Result end. loop(Port) -> receive {call, Caller, Msg} -> Port ! {self(), {command, encode(Msg)}}, receive {Port, {data, Data}} -> Caller ! {example1, decode(Data)} end, loop(Port); stop -> Port ! {self(), close}, receive {Port, closed} -> exit(normal) end; {'EXIT', Port, Reason} -> exit({port_terminated,Reason}) end. encode({twice, X}) -> [1, X]; encode({sum, X, Y}) -> [2, X, Y]. decode([Int]) -> Int. 需要注意的是调用python程序,要使用参数-u。强制标准输入/输出不得有缓存,要立时反应。 python官方文档对-u的解释: Force stdin, stdout and stderr to be totally unbuffered. python side: example2.py Python代码 import sys, os import struct def recv(): buf = sys.stdin.read(2) if len(buf) == 2: (sz, ) = struct.unpack("!h", buf) payload = sys.stdin.read(sz) return payload else: return None def send(payload): sz = len(payload) header= struct.pack("!h", sz) return sys.stdout.write( header + payload ) def twice(arg1): return 2*arg1 def sum(arg1,arg2): return arg1+arg2 def main_loop(): buf = recv() while buf: xa = struct.unpack("!%dB" % len(buf), buf) if xa[0] == 1: calc_res = twice(xa[1]) elif xa[0] == 2: calc_res = sum(xa[1], xa[2]) result = struct.pack('!B', calc_res) send(result) buf = recv() return None if __name__ == '__main__': main_loop()
ζ浮云¢惊龙 2010-10-08 22:25
http://docs.djangoproject.com/en/dev/intro/tutorial01/
状元 2010-08-25 08:04
不清楚新浪微博和twitter等的推拉模式,都写的这么好了 要是清楚了就更好了 支持一下
楼主 2009-11-16 15:49
ALTER FUNCTION [dbo].[f_Get_DownCorpTree] (@CorpID nvarchar(100)) Returns @CorpTree TABLE ( CorpID nvarchar(100) ) As Begin --调用方法:Select * From f_Get_DownCorpTree('919') insert into @CorpTree select deptID from ORGM_Orgs where parentdeptID = @CorpID while @@Rowcount >0 --只要有下级节点就循环 begin insert into @CorpTree select a.deptID from ORGM_Orgs as a inner join @CorpTree as b on a.parentdeptID = b.CorpID and a.deptID not in (select CorpID from @CorpTree) end insert into @CorpTree (CorpID) values (@CorpID) Return End ------------------------------------------------------- ALTER FUNCTION [dbo].[f_Get_UpCorpTree] (@CorpID nvarchar(100)) Returns @CorpTree TABLE ( CorpID nvarchar(100) ) As Begin --调用方法:Select * From f_Get_UpCorpTree(8) --Select * from OU_Depts --Declare @CorpID nvarchar(100) --Select @CorpID = '919' --Declare @CorpTree Table (CorpID int, flag varchar(10)) Declare @TmpCorpID nvarchar(100) Declare @tmpJumpCorpID nvarchar(100) Select @TmpCorpID = @CorpID --得到公司的上一级公司 GetUpCorp: Select @tmpJumpCorpID = @TmpCorpID Select @TmpCorpID = [ParentdeptID] From [ORGM_Orgs] Where [DeptID] = @TmpCorpID if (@TmpCorpID is not null and @tmpJumpCorpID <> @TmpCorpID) Begin --Print Convert(varchar(10),@TmpCorpID) Insert into @CorpTree (CorpID) Values (@TmpCorpID) goto GetUpCorp End Return End
ζ浮云¢惊龙 2009-07-14 15:18
很不错,LinkedIn的思路正是我一直倡导分布式计算思路。 特别是Cloud,是一个内存计算的典型特征,有三个特征: 1. 从硬盘重建Cloud一个实例需要8个小时,很显然Clound不能随便当机,而且是不依赖持久化媒介如DB的。 2。Cloud通过databus实时更新 这是技术难点。 3。关闭时持久化到硬盘,7/24全年99%几乎无需关闭,一旦关闭,用户就不能使用了。 从以上看出,Cloud是一个脱离DB技术的架构. 技术难点是如何同步问题: Fenng 认为:如何保证数据在各个 RAM 块(也就是不同的计算服务器)中是同步的呢? 需要一个比较理想的数据总线(DataBus)机制。 在不同分布式服务器的内存RAM中进行同步有两个方向: 1. 在server之间拷贝RAM中数据。 2. 使用DB,也就是Fenng 提到的Oracle的dataBus概念。 目前Java架构中,都是倾向于使用第一种,内存之间直接刷新异动,应该比先回数据库,再从数据库触发多个服务器要快速得多。 当然,具体怎么做不得而知,是核心秘密。大家猜猜而已。 楼上有人提到:我们相信不使用昂贵的EJB就可以实现世界一流级的项目 这对EJB有误解,首先EJB不昂贵,使用普通PC就能完成分布式计算;昂贵的是集中式DB模式,需要更大更强的主机;EJB使用很方便,只要加上@stateless就变成EJB了。 EJB是一个通用的商务解决方案,是各个因素的综合折中考虑,尤其是事务安全和性能中和,而社区网站则侧重于高性能,事务安全可以忽视,因此EJB不一定适合社区网站,而且一个自己的网站要杰出,当然必须走手工定制分布式计算这条路,而不是选择通用的解决方案。 OO + 分布式计算 = 软件架构的方向 http://www.jdon.com/artichect/architecture.html EJB+IBatis这种做法合理吗? http://www.jdon.com/jivejdon/thread/34262.html [该贴被banq于2008-06-25 16:58修改过]
ζ浮云¢惊龙 2009-07-14 15:16
LinkedIn 架构笔记 作者: Fenng 现在是 SNS 的春天,最近又有消息传言新闻集团准备收购 LinkedIn。有趣的是,LinkedIn 也是 Paypal 黑帮 成员创建的。在最近一个季度,有两个 Web 2.0 应用我用的比较频繁。一个是Twitter,另一个就是 LinkedIn。 LinkedIn 的 CTO Jean-Luc Vaillant 在 QCon 大会上做了 ”Linked-In: Lessons learned and growth and scalability“ 的报告。不能错过,写一则 Blog 记录之。 LinkedIn 雇员有 180 个,在 Web 2.0 公司中算是比较多的,不过人家自从 2006 年就盈利了,这在 Web 2.0 站点中可算少的。用户超过 1600 万,现在每月新增 100 万,50% 会员来自海外(中国用户不少,也包括我). 开篇明义,直接说这个议题不讲"监控、负载均衡”等话题,而是实实在在对这样特定类型站点遇到的技术问题做了分享。LinkedIn 的服务器多是 x86 上的 Solaris ,关键 DB 用的是 Oracle 10g。人与人之间的关系图生成的时候,关系数据库有些不合时宜,而把数据放到内存里进行计算就是必经之路。具体一点说,LinkedIn 的基本模式是这样的:前台应用服务器面向用户,中间是DB,而DB的后边还有计算服务器来计算用户间的关系图的。 问题出来了,如何保证数据在各个 RAM 块(也就是不同的计算服务器)中是同步的呢? 需要一个比较理想的数据总线(DataBus)机制。 第一个方式是用 Timestamp . 对记录设置一个字段,标记最新更新时间。这个解决方法还是不错的---除了有个难以容忍的缺陷。什么问题?就是 Timestamp 是 SQL调用发起的时间,而不是 Commit 的确切时间。步调就不一致喽。 第二个办法,用 Oracle 的 ORA_ROWSCN (还好是 Oracle 10g). 这个伪列包含 Commit 时候的 SCN(System Change Number),是自增的,DB 自己实现的,对性能没有影响。Ora_ROWSCN 默认是数据库块级别的粒度,当然也可做到行级别的粒度。唯一的缺点是不能索引(伪列). 解决办法倒也不复杂:增加一个 SCN 列,默认值"无限大"。然后用选择比某个 SCN 大的值就可以界定需要的数据扔到计算服务器的内存里。 ORA_ROWSCN 是 Oracle 10g 新增的一个特性,不得不承认,我过去忽略了这一点。我比较好奇的是,国内的 Wealink、联络家等站点是如何解决这个关系图的计算的呢?
ζ浮云¢惊龙 2009-07-14 15:08
我来谈点缓存引入在架构上的重要意义,大家都在快慢这个层次来讨论缓存,经过多少个来回,好不容易正反方都基本同意缓存能够帮助数据库提升性能,但我要说的是:缓存不是数据库的遮羞布。 缓存的重要作用分两层是: 第一,首先断绝了面向数据库的编程思路,你要面向缓存中的对象编程,这个话题xmuzyu也谈过了,其实也是内存计算模式。 第二,缓存是一把刀,切断了传统的编程思路,使的可切分Partition 以及Asynchrony 异步实现成为可能,从而为程序引入伸缩性打开了一个入口。 Partition everything和Asynchrony everything在本周JavaOne大会上被eBay架构师就谈到了,他们总结一下他们建立大型系统的经验,最佳实践就是: 1. Partition everything.(切分任何事情 包括业务领域知识) 没有切分就没有伸缩性,把大问题切分成小问题,这其实就是OO细分松耦合的概念,在ebay没有数据库和应用服务器的称谓(因为数据库和应用服务器都是盒子的概念,不可切分的),有的只是可切分的领域功能,这些领域是跨层或者可负载平衡的。 2. Asynchrony everywhere.(在程序中任何可能地方引入异步,就象前面谈到在JiveJdon中引入缓存后,可以异步引入数据库储存)。 通常我们的程序都是同步系统,我们程序员也都是同步串行化编程思维,这也是并行程序员很少的原因,同步就是一个请求马上又反映,我发出请求你必须立即给我响应,这其实有“刚”的成分在里面,当系统访问量大增,刚则易断了,系统当机或停止服务的原因是因为访问量大增,这是很不专业和外行的奇怪逻辑。本质是对架构的愚昧和无知。 ebay倡导尽可能到处使用异步,追求异步最大化,这其实就是业务和OO设计或架构设计的博弈,作为架构师,你是战斗一方,你不是局外者,你必须秉承将异步胜利进行到底的理念和业务做斗争,将业务全部锤散直至不能再散为止,这个没有尺度数量标准的,因为不同业务不一样,也取决于你的能力。 ebay是从事件这个架构高度出发,将软件看成一个事件响应器,软件死机崩溃就是无法对后续事件处理,那么我们把Event Queue事件专门做成一个Queue队列,进行排队处理,做到事件不丢失,因为你一旦丢失一个事情或者无法处理,就是用户的抱怨和客户流失。当然低层性能人士会跳出来说性能问题,如果我们有一个并行强大的事件处理设计,那么就不会有性能问题,就象你食堂里,为什么排队买菜,不是你排队这个选择选错了,是卖菜的人忙不过来,要看问题本质。 ebay使用消息机制来广播修改通知,这也是典型的一个缓存更新的大架构。 3. Automate everything:将更多事情自动化,机器处理,比如用户个性化的东西可能不能用缓存,但是我们可以研究这个用户的习惯操作和思维;使用网管软件之类工具自动探测机器的健康状态,及时报告。 4. Remember, everything fails.(单点风险,也就是提高可靠性,使用冗余策略) 5. Embrace inconsistency.(积极面对不一致性) 一致性也可以从缓存更新这个角度理解,当缓存中共享对象状态更新后,是不是所有机器上这个对象状态都必须立即同时更新?没有这个必要,可以根据业务需求来决定,有些需求就没有必要立即更新,比如user preference等。 为了能够提供立即更新的一致性, eBay避免使用一些可分布的事务比如客户端端的JDBC, 提高一致性最大化的方式就是使用状态模式,状态机,也就是内存或缓存中对象状态机,以及小心处理数据库操作的次序;事件一致性可以通过异步事件或轻量可重复执行的柔性的批处理来完成。 http://java.sun.com/javaone/2009/articles/gen_ebay.jsp
ζ浮云¢惊龙 2009-07-14 15:08
其实说到面向对象系统中的缓存,主要有三个切入点 1.事务相关缓存:可能是一个数据库事务,可能是一个对话,只有在当前工作单位有效,这样的缓存不会被并发访问 2.process相关缓存,被并发的工作单元或事务共享,缓存中的数据被并发线程访问 3.集群相关缓存,同一台机器的多个process之间,或者集群下的多个机器之间共享,主要关注网络通信 对于应用以上几种缓存的一点经验是对于多用户,可伸缩性要求很高的web或企业级应用,应该避免内存中保存锁(除一些内容管理类型的应用程序),而推荐大量应用事务范围缓存(类型1),但是也有限制,比如内存要求很大,因为事务范围内存消耗和并发数成正比 对于process相关缓存(类型2)或集群范围缓存(类型3)一个比较好的备选是 a.很少改变的对象 b.不重要的对象(如内容管理类型的应用) c.应用程序固有(数量一定)的对象 d.被其他类的很多实例引用的实例(称为引用数据)
ζ浮云¢惊龙 2009-07-14 14:58
不过.NET上最好的地方莫过于它的可扩展性了,所以如果垃圾收集器在你16GB的机器上进行内存管理时表现不好,那么你可以使用Berkeley DB或你自己的非托管存储进行替换。要享受.NET的优势也不必把自己完全局限在.NET中。我想说.NET有良好的伸缩性,而且我们的规模也会越来越大。你不妨过几年再来问我这个问题,看看我会怎么说。 你们在服务器或伸缩性方面有没有使用其他的微软企业产品? 应该说,有新东西出来的时候我们就会试试看。例如Enterprise Application Block、Remoting和Web Service我们都尝试过。如果你真想做一个大规模的应用程序,那么这就是我的建议:一般来说,我们最后会使用自己的实现,因为我们不需要如此通用的解决方案,我们真正需要的是性能。我想说的是,我们尝试了某个东西之后就从中学到些东西,然后可能就会把其中有价值的地方给剥离出来,再为了达到我们的性能或伸缩性需求重新写一个。我不觉得微软会在我们这种规模的应用程序中进行测试,所以好像是我们在为他们测试一样。所以,如果有些东西可以在几十台服务规模的程序中工作正常,但是无法满足MySpace的伸缩性要求,我觉得这是一件稀松平常的事情。 你能否给出一个例子,关于对.NET或微软告诉你应该做的东西,却反其道而行之? 我觉得我写的Profiler算是一个吧。如果他们不会发现的话,我会使用很多肯定违反服务器担保条例的东西,例如因为性能为CLR代码打补丁。我们看了很多C++运行时的代码,也一直用Reflector来查看内部情况,可能有时候还会在产品代码中用到反编译来修补一些我们觉得微软做的不好的东西。不过我们尽可能避免这种做法,所以我举不出一个真正的例子来说明我们在什么地方反其道而行。不过每次遇到这些小问题时,我们会说“不如稍微修改一下,希望能够有用”,而不是“好吧,我们重新用一个新的技术”。 你能多谈一写缓存层的东西吗?我对你处理一些常见的缓存问题的方法很感兴趣,例如更新之类的事情。 我们正好在处理这方面的问题。目前,缓存层既不是write through也不是read through的。基本上web服务器做的事情会分两步走。首先检查缓存,如果没有东西,那么web服务器会从数据库里取出对象并序列化,发送给用户页面,然后异步地提交给缓存,然后下一次再重复这个过程。我相信在某些时候我们会使用一个更加传统的三层模型,这样web服务器不会直接连接数据库,不过目前我们仍然基于简单的两层:web服务器和数据库,而缓存层只是简单的附属物。当以后规模越来越大时,我们就会着手把访问转移到缓存中,最终会让web服务器连接缓存服务器,而不是数据库。 不过目前看来,对象存储工作得相当不错,我们也在这方面思考了很多。它只是用来存储对象,它并不知道保存了什么或者那些东西从哪里来,这对性能可能有些好处,我不确定。不过从几年前我们需要缓存的时候,就把它设计成可以轻松增加的服务。我们现在有400台运行飞快的服务器,如果有东西变慢了,那么我们就会进行升级。没什么特别的。
ζ浮云¢惊龙 2009-07-14 14:57
微软现在在版本号的使用上有些疯狂。我早先看了看他们的路线图,其实3.5不过是在2.0的基础上增加了一点扩展。所以你安装了3.5之后自然就有了 2.0的运行基础。这种做法有点奇怪,不过我觉得3.5中的有些东西似乎还不错,例如Windows Communication Foundation提供了很方便的web service功能,还包括了事务控制等特性,让我们放弃了老旧的remoting和web service编程模型。我们对WCF还没有使用太久,不过看上去这些东西很令人兴奋,它可以让我们摆脱不少已经存在多年的负担,以前我们不得不编写自己的网络通信类库,只是因为remoting和web service功能上存在一些小毛病。 所以说,整个网站是建立在2.0和3.5之上的,你们使用的工具基于PowerShell。不过还有一点,你们整个系统里有没有配合使用的调试工具呢? 这些工具里我最喜欢的是一个叫做“Profiler”的工具。它使用C++编写,基于微软CLR侦测(profiling)接口,所以我们只要说“OK,我们的堆栈转储接口可以展示一些实时的信息,比如当前各个部件都在做什么事情”,然后侦测接口就能说“好吧,我会每10秒对这个线程进行一次检查,我会从头至尾监测一遍,我会告诉你每个调用花费了多少时间,告诉你每个异常的信息,每次内存分配,锁的竞争状况,还有各种依靠调试器查看静态状态等做法获取不到的信息”。 这个Profiler的作用不光是在错误的情况下告诉我们发生了什么,还可以在正常状况下告诉我们那些请求对系统产生了什么样的影响。我们的系统中有大量不同的人写的各式各样的模块,所以对我这样的人来说,就算已经对系统有所了解了,查看那些跟踪记录有时候也会有新发现,比如“我不知道我们居然做了这些事情”。它可能是我们开发的技术最复杂的工具,这也是仅有的几个不使用.NET开发的工具之一,这是因为你无法编写.NET代码来监测.NET代码。这里我们用了很多C++,有意思的是它利用了微软研究院的Detours类库,在技术上类似于他们用来偷偷摸摸为内核打补丁的方法:把现有代码导向别处,再调用回来,这样程序并不知道自己已经被打上了补丁了。我们也用这种方式来获得一些微软的接口无法提供但有时候特别有用的一些信息。 你提到了C++,我记得你之前也谈到过VB和VBScript? 大约两年前我们使用VBScript。现在我们使用C#作为.NET开发语言。 在MySpace内部使用什么语言呢? 我必须提到CLR本身基本上完全是由C#编写的。我们内部也有一些“先驱”在尝试一些诸如F#之类的东西。F#来自微软研究院,看上去是个相当不错的东西。我在不少工具里嵌入了IronPython脚本,因为我觉得就配置工作而言,它可以带来更多控制能力。与钩选几百个选择框相比,我现在只要几句 IronPython脚本就能完成工作了。就总体来说,我们用C#做前台和后台开发,在各种必要的时候就会用到IronPython和 PowerShell。 你们打算迁移到LINQ等各种.NET 3.5新特性上吗? 事实上LINQ给我的感觉可谓一天比一天深刻。我找不到任何理由不让所有的服务器升级,或者不让开发人员使用它。LINQ看上去是个非常巧妙的技术,对于像我这种喜欢写SQL查询的人来说,可以用LINQ来处理XML,各种对象或内存中的数据,这种感觉实在是太酷了。可能有一天我们还可以使用自定义的 Provider,谁知道呢?真是个不错的东西,我希望很快就能在服务器上看到LINQ的使用。 对于最近发布的MySpace开发者工具,你们有没有打算让开发人员可以使用一些不同的语言,例如C#?还是让他们继续基于JavaScript或VBScript这样的脚本语言进行开发? 其实我还没有确定未来的打算。我知道刚发布的开发者平台是网站上的小部件(widget),可惜目前只支持JavaScript。也许您自己的富客户端应用程序可以调用系统中完整的API,不过我实在无法确定这方面内容。 对于MySpace这样的大型网站来说,如果你遇到了问题,例如服务器的负载到达了峰值,有没有办法可以创建一个补丁让问题直接消失,还是只能一点一点地改变,把问题分成几个部分依次解决? 这个问题很好,我觉得要从两方面来看这个问题。一是发现问题,二是解决问题。很多时候我们会发现“OK,站点的请求排队了,我们该怎么办?”我们其实不知道为什么会发生这个情况,然后只是增加了几台服务器。好,似乎问题有所改善,不过其实你并不知道这时是否应该增加服务器,有可能只是后台的数据库刚好在进行备份。这不仅在于你不知道哪里出现了错误,还有目前的做法可能在今后就不起作用了。所以一开始的困难在于,我们要如何开始识别这些问题,我们该如何让前端网络操作中心(NOC,Network Operation Center)的人有能力指出这些问题。一旦这个困难解决了,那么他们就可以比较容易确定该向谁汇报问题。 当然,有可能这的确是一个代码上的问题,我们努力希望让中间层或后端的代码与前台兼容。如果我们发布了一个东西,结果在QA时正常,测试时正常,但是发布到网站之后却有问题了但又不清楚是什么原因,那么最简单的方法是回滚这次发布或是禁用这个功能。一般来说,使用了正确的工具包之后,很少会出现找不出问题所在的情况。一开始我们的工具包比现在要小得多,不过如果每天都会发现类似的问题,那么我们会说“好,那么我们用调试器检查一下”,第二天说“我再用调试器看看这个问题”,而第三天:“算了,我要自己写一个工具,现在的那些派不上用场”。于是我们的工具包越来越完整,这样快速发现和诊断问题的能力也就提高了。 整个排错的过程是什么样的呢?系统是如何适应伸缩要求,这一点上理论和产品上有没有什么区别呢?它又是如何影响系统架构的呢? 嗯,目前系统架构模型主要分为三层:前端,缓存层和数据库。所以要大幅度改进其伸缩性会是件困难重重的事情。我们一开始会说“我们现在的这条数据库查询不太好,那么我们试试看简单的修复一下,把它放到缓存中去”。好吧,这没啥效果,那么我们可能要建立另一套系统了。我们就开始琢磨这个问题,我们有不少这样的系统,如果性能出现问题了那么我们可以对它们分别进行优化,比如把这部分移出数据库,放到磁盘上,或者就放在内存中。如果某个地方出现了问题,那么我们会开发一个新的系统。这在MySpace中并不多见,因为我们在一开始在水平分割上的考虑十分有效。不过当你打算获得更多9【译注:即99.99……%】的可用时间时,就会在决策上有很大的改变。 这可能是个有2-3年历史的老问题了,不过在提及“.NET无法伸缩”的问题时,你会怎么答复呢? 我觉得不存在这方面问题,关键在于你有没有使用正确工具,是否有这方面的专家。事实上我觉得现在.NET已经是一个非常成熟的平台了。显然Java在这方面领先于.NET,不过我想我们还是互联网上最大的.NET站点。我不知道你会把我们的可用时间和性能与同样规模的Java站点进行什么样的比较,我们遇到的各种问题都不是.NET平台本身造成的。可能是我们自己的bug,可能是硬件问题,但是我没有真正遇到过.NET的问题,除了在垃圾收集方面我可能会说“这的确很难进行伸缩”。
ζ浮云¢惊龙 2009-07-14 14:57
大家好,我是Ryan Slobojan,这位是MySpace的Dan Farino。Dan,你能介绍一下你在MySpace的工作吗? 没问题。我是MySpace的首席系统架构师。简单地说,我开发了我们使用的许多后台自定义性能监视和排错工具。当初我刚到那里时,所遇到的问题主要是系统依赖大量的手动配置,大量的手动管理,以及需要大量管理员来创建各种脚本来执行例如重启服务器等工作。你可能要在一个非常简单的问题上花费30分钟甚至一个小时的时间。因此,一开始我主要关注于从系统管理的角度出发构建一些自动化工具,希望可以让排错或性能诊断等问题变得简单一些。 你能否想我们解释一下,对如此大型的站点进行调试和排错时遇到了哪些挑战呢? 很多时候问题的关键在于,如何从几千台服务器中找到出现问题的那台。所以我开发了一个性能监视系统,可以实时获取整个服务器场中每台机器的CPU、队列中的请求数以及每秒处理的请求数量等这种类型的信息。这样我们就可以直观地看着屏幕上的一台红色的服务器:“喂,我的队列中累积请求了”。然后问题就变成了:“好吧,我们已经知道哪台机器有问题了,不过现在该怎么做?”如果我们获取一个内存快照(memory dump)并发送给微软,可能要过一个星期才会有反应说“嗨,你们的数据库服务器挂了”。不过我们希望能在两个小时内发现这个问题,所以我们在右键菜单里放了一些简单的工具,可以让一些运维人员——他们不是开发人员——发现说“我看到几百个线程在数据库访问时阻塞了,我估计是数据库的问题”。我们关注于为出错的服务器提供高度可视化的方案,还开发了一些工具,可以让一些技术不那么强的管理员快速发现问题。 很有意思。你能否从技术角度大致描述一下MySpace的架构呢? 当然。可能从前端开始谈这个问题最为合适。我们有大约三千台Windows 2003 IIS 6服务器。这些代码运行在.NET 2.0上,少部分是.NET 3.5。不同的.NET的版本会造成各种麻烦问题,不过前端还是运行了.NET 2.0和3.5。我们使用经过调节的SQL Server作为后端存储。不过数据库查询的性能不足以应对站点对伸缩性的要求,因此我们开发了一个自定义的缓存组件。这是个简单的对象存储部件,通过自定义的socket层进行通信,全部存储在64位.NET 2.0机器中的非托管内存中。因为我们最早遇到的问题之一便是.NET的垃圾收集器。 就算在64位平台上,回收和压缩数以亿计的对象还是会造成较为明显的延迟。所以我们面向伸缩性的问题之一便是“必须自己编写非托管的内存存储”。我们在存储的前端使用.NET进行通讯,并与这一存储层进行交互——我们称之为缓存层,这大大降低了数据库的压力。现在我们的数据库从SQL 2000升级至64位SQL 2005,这样内存中可以存放更多的数据,这带来了很大的性能提升。起初我们使用Windows 2000中的CodeFusion 5以及少量的数据库。我们最早在数据库伸缩性方面做的努力是进行了纵向划分——或横向划分,我不知道你们把这叫做什么方向——把每100万个用户放在不同的数据库中。 这么做提高了伸缩性,也让我们能够轻松地添加硬件,并对错误进行隔离。如果一个数据库当机了,只有一小部分用户会在我们处理这个问题之前得到错误信息或正在维护的消息。我们在Linux上构建了一个自定义的分布式文件系统,用于存放用户上传的媒体内容,并作负载均衡。所有的视频或mp3等内容都放在这个自定义的DFS层上,实现了跨数据中心的冗余,并通过HTTP直接从磁盘中获取数据。 你们在扩大网站规模时遇到了哪些挑战?你提到,一开始你们使用了CodeFusion服务器,不过现在使用了数以千计的IIS服务器。你们是怎么进行切换呢?你们扩大网站规模时只是通过增加服务器数量吗? 许多服务器用来构建中心缓存了,这可以大大降低数据库服务器的压力。还有,如果你使用大量后端数据库,就可能会遇到一个问题:如果其中一个数据库服务器当机了,那么它会很快拒绝来自Web服务器的请求,问题不大。不过,假如只是这个后端服务器变慢了,试想某台Web服务器正在为大量不同的用户提供服务,很可能其中一个缓慢的请求就会阻塞在这个坏的数据库上。 不过此时其它请求依旧工作正常,不过迟早就会有另一个请求阻塞在坏数据库上。可能过了十几秒钟之后Web服务器上所有的线程就被这个数据库阻塞了。所以我到那里之后第一个架构的东西便是错误隔离系统,它运行在每台Web服务器上说:“我只允许同时向同一范围的服务器发起x个请求”。这避免了单个坏服务器让整个站点停止响应。原本我们会在扩展的同时可能会遇到越来越糟糕的情况,因为添加了更多可能会造成单点失败的地方,整个站点停止响应的可能性也提高了。现在我们在IIS上部署了错误隔离模块,这样增加了网站的正常运行时间。再加上缓存层的功效,正常运行时间进一步增加了。 听上去你们做得很多事情都是在现有工具的基础上构建扩展,那么在微软平台上这么做的感觉如何? 感觉非常好。我们使用微软的Powershell。它早先的代码名(code name)是Monad,提到这个名称的原因是我们从Monad beta 3就开始在生产环境中使用它了。它出现的正是时候,因为那段时间我们几乎已经把所有推荐的Windows管理技术,例如VBScript、命令文件等,都用到极限了。 那些东西在本机上工作的很好,如果你想要看另一台机器上的注册表配置也不错。不过如果要在数千台服务器运行命令的话,你就会遇到瓶颈。首先你只能每次访问一台服务器,其次,如果遇到了一台当机的服务器,那么整个工作就停止了。为了解决这个问题,我自己写了一个简单的远程服务层,于是问题就又变成了“我怎么样才能把它做的通用呢?”我们希望可以轻松地对一系列的服务器进行操作,比如执行一条命令,获得一些结果,进行处理,然后可能运行另外一条命令——也就是说,这些操作形成了一个管道。 就在这时候PowerShell出现了,帮了很大的忙。PowerShell完全用.NET编写,它在同一个进程里运行所有的命令,这个好处在于命令A可以输出各种东西,而不仅仅是字符串,并让命令B可以接着进行处理。它们之间可以顺着管道传递任意的.NET对象,这样就形成了一种非常强大的编程模型,让那些只愿意坐下来写一点点命令的管理员们也乐于使用。于是我们就决定使用那些命令,例如我对MySpace说“VIP”,意思运行特定功能的一组虚拟 IP。如果我说“Profile VIP”,意思就是指运行profiles.myspace.com的所有几百台服务器,然后可以对它们统一进行处理。于是我们构造了一个叫做“Get VIP”的命令。 我们使用RunAgent命令的管道,可以并行地在远程机器上执行任何命令,并把任何对象放进管道里。例如你可以用PowerShell的语法来描述“告诉我这个东西是true还是false,某个文件是不是存在”,然后把结果传递到另一个管道中,不断传递,这样就可以快速地处理一些特定的管理任务。人们在写脚本的时候就不需要担心网络是否失败,也不用担心多线程执行的状况,因为我已经把这些问题处理掉了。我抽象了网络连接,抽象了并行特性,这样可以把一些本来要花30分钟甚至1小时的工作用大约5秒钟就完成了,更可靠,可容易控制,更容易进行帐户管理或日志记录。 真厉害。我想你之前一定也听到过这样的问题,为什么你们会选择使用微软的技术而不是其他一些常见的选择呢? 嗯,在我到来之前其实就已经做出这个决定了,我刚到的时候系统运行在CodeFusion平台上,有大约两千万用户。我们有非常非常优秀的.NET开发人员,不过我不确定我们到底是专门找了.NET方面的人才,还是找了最好的开发人员,然后他们正好谈到“.NET是个不错的东西,我们就试试看吧”。不过我认为,事实上我们很早就已经使用微软平台了,因此延续使用.NET是一件很自然的事情。我也不是一个搞Java的人,我的背景和微软技术比较接近,微软也给了我们不少帮助,让我们在使用.NET这个相对较新的技术时度过了一个个难关,所以它给我的感觉还是相当不错的。 刚才你提到,你们混合使用了.NET 2.0和.NET 3.5?它们配合的怎么样?有没有计划完全迁移到3.5上?
ζ浮云¢惊龙 2009-07-14 14:53
LinkedIn几位工程师使用开源分布式缓存Voldemort和云计算Hadoop 构架他们的系统,写了构建 TB 级的 key-value 系统的经验,见博客文章:Building a terabyte-scale data cycle at LinkedIn with Hadoop and Project Voldemort: http://www.jdon.com/jivejdon/forum/messageList.shtml?thread=36369&message=23123211#23123211 [img]http://project-voldemort.com/blog/wp-content/uploads/2009/06/linkedin_arch.png[/img]
ζ浮云¢惊龙 2009-07-14 14:52
http://www.infoq.com/cn/interviews/MySpace-Architecture-Dan-Farino-cn# MySpace首席系统架构师Dan Farino谈论了超大线上社区的系统架构,以及构建这样一个系统所面临的各种挑战。由于MySpace几乎完全基于.NET Framework开发,Dan还解释了一个.NET平台下的产品是如何在数百台服务器上达到强大伸缩性的。 不过数据库查询的性能不足以应对站点对伸缩性的要求,因此我们开发了一个自定义的缓存组件。这是个简单的对象存储部件,通过自定义的socket层进行通信... 所以我们面向伸缩性的问题之一便是“必须自己编写非托管的内存存储”。 我们最早在数据库伸缩性方面做的努力是进行了纵向划分——或横向划分,我不知道你们把这叫做什么方向——把每100万个用户放在不同的数据库中。 这么做提高了伸缩性,也让我们能够轻松地添加硬件,并对错误进行隔离。如果一个数据库当机了,只有一小部分用户会在我们处理这个问题之前得到错误信息或正在维护的消息。我们在Linux上构建了一个自定义的分布式文件系统,用于存放用户上传的媒体内容,并作负载均衡。 整个排错的过程是什么样的呢?系统是如何适应伸缩要求,这一点上理论和产品上有没有什么区别呢?它又是如何影响系统架构的呢? 嗯,目前系统架构模型主要分为三层:前端,缓存层和数据库。所以要大幅度改进其伸缩性会是件困难重重的事情。我们一开始会说“我们现在的这条数据库查询不太好,那么我们试试看简单的修复一下,把它放到缓存中去”。好吧,这没啥效果,那么我们可能要建立另一套系统了。我们就开始琢磨这个问题,我们有不少这样的系统,如果性能出现问题了那么我们可以对它们分别进行优化,比如把这部分移出数据库,放到磁盘上,或者就放在内存中。如果某个地方出现了问题,那么我们会开发一个新的系统。这在MySpace中并不多见,因为我们在一开始在水平分割上的考虑十分有效。不过当你打算获得更多9【译注:即99.99……%】的可用时间时,就会在决策上有很大的改变。 这可能是个有2-3年历史的老问题了,不过在提及“.NET无法伸缩”的问题时,你会怎么答复呢? 我觉得不存在这方面问题,关键在于你有没有使用正确工具,是否有这方面的专家。事实上我觉得现在.NET已经是一个非常成熟的平台了。显然Java在这方面领先于.NET,不过我想我们还是互联网上最大的.NET站点。我不知道你会把我们的可用时间和性能与同样规模的Java站点进行什么样的比较,我们遇到的各种问题都不是.NET平台本身造成的。可能是我们自己的bug,可能是硬件问题,但是我没有真正遇到过.NET的问题,除了在垃圾收集方面我可能会说“这的确很难进行伸缩”。 不过.NET上最好的地方莫过于它的可扩展性了,所以如果垃圾收集器在你16GB的机器上进行内存管理时表现不好,那么你可以使用Berkeley DB或你自己的非托管存储进行替换。要享受.NET的优势也不必把自己完全局限在.NET中。我想说.NET有良好的伸缩性,而且我们的规模也会越来越大。你不妨过几年再来问我这个问题,看看我会怎么说。 你能多谈一写缓存层的东西吗?我对你处理一些常见的缓存问题的方法很感兴趣,例如更新之类的事情。 我们正好在处理这方面的问题。目前,缓存层既不是write through也不是read through的。基本上web服务器做的事情会分两步走。首先检查缓存,如果没有东西,那么web服务器会从数据库里取出对象并序列化,发送给用户页面,然后异步地提交给缓存,然后下一次再重复这个过程。我相信在某些时候我们会使用一个更加传统的三层模型,这样web服务器不会直接连接数据库,不过目前我们仍然基于简单的两层:web服务器和数据库,而缓存层只是简单的附属物。当以后规模越来越大时,我们就会着手把访问转移到缓存中,最终会让web服务器连接缓存服务器,而不是数据库。 不过目前看来,对象存储工作得相当不错,我们也在这方面思考了很多。它只是用来存储对象,它并不知道保存了什么或者那些东西从哪里来,这对性能可能有些好处,我不确定。不过从几年前我们需要缓存的时候,就把它设计成可以轻松增加的服务。我们现在有400台运行飞快的服务器,如果有东西变慢了,那么我们就会进行升级。没什么特别的
ζ浮云¢惊龙 2009-07-14 13:50
A terabyte cache with the RESTful Ehcache Server 使用RESTful EhCache服务器实现TB级级别缓存 http://gregluck.com/blog/archives/2008/08/_the_restful_eh.html 使用RESTful接口实现数据分区(也可以称为通常的数据库分离),一个最大的ehcache可以有20GB内存,而最大的磁盘存储是100Gb. 使用数据分区将这些节点组合在一起,可以得到更大的内存,50个节点X 20GB可以得到1TB。 非冗余的一个设计: [img]http://docs.google.com/File?id=agbdcfj3mkdt_23ftq7nfgj_b[/img] 带客户端Hash的设计,代码如下: String[] cacheservers = new String[]{"cacheserver0.company.com", "cacheserver1.company.com", "cacheserver2.company.com", "cacheserver3.company.com", "cacheserver4.company.com", "cacheserver5.company.com"}; Object key = "123231"; int hash =Math.abs(key.hashCode()); int cacheserverIndex = hash % cacheservers.length; String cacheserver = cacheservers[cacheserverIndex] 图示: [img]http://docs.google.com/File?id=agbdcfj3mkdt_21fmncv7g5_b[/img] 有趣的是,一些内容交换的负载均衡器可以使用某种形式的正则表达式可以实现URI路由,如下代码所示,所以,你可以不选择上面客户端Hash散列实现分割的方式来实现负载平衡器。 /ehcache/rest/sampleCache1/a1 =>cluster1 /ehcache/rest/sampleCache1/a2 =>cluster2 当然,更复杂的是使用F5负载平衡器,还可以使用TCL创建iRules,但是比正则表达式要复杂。F5的URI hashing iRule见: http://devcentral.f5.com/Default.aspx?tabid=63&PageID=153&ArticleID=135&articleType=ArticleView 个人建议:图中Cluster组可以使用Terracotta,可自动整合Ehcache,对程序无侵入性,更新性能好于memcached,比JMS JGroups要高级多。 见配置:http://www.terracotta.org/web/display/docs/About+Terracotta+Configuration+Files >网络上的操作实质就是请求从一个状态转移到另一个状态 这个实际可以从上面第一个帖子中旅游线路举例中可以看出。 另外DBC(Design by contract)模式中提出三个约束:前置条件与后置条件和不变性,其实质隐喻是这样:行为条件导致状态变化,状态必须保持不变性。这是大多数软件系统的实质,是大道至简的一句话。 这和Roy博士这句话是一个意思,有状态就要保持一致性,以前我们都是在服务器端来实现,这里DDD中也大量谈了一致性问题,通过根实体和边界来实现,需要锁或事务来具体实现,而REST认为将状态转移到客户端后,服务器端也许就不用这么吃力了。 这是一个新思路,是否成功也是需要拭目以待的,所以,现在很多人在讨论REST的事务问题,这是维持状态一致性要求导致的。 >REST必须是超文本驱动的 这个我非常认同,在我上面的"REST是什么"中已经翻译了Roy比较JavaScript和Java结论,JavaScript或Annotation可以认为是一种超文本。 这里有另外一篇文章: REST API必须是超文本驱动的 REST APIs must be hypertext-driven http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven 文中批判了GlassFish开发的 SocialSite REST API.实际是RPC,不是REST,现在很多初学者觉得GlassFish很好,因为它又在玩把什么好玩意都放在一个盒子里,诱骗小孩的把戏了,不懂的人看到,里面有很多糖糖果果,好啊,其实拿来后都没有用,用起来必须和Netbeans结合才好用,这样不可分离的技术有屁用?完全是违背现在透明化细分大势。 REST就是把通讯暴露出来,但是又不完全暴露,若隐若现才最美,这就是设计艺术性。 超文本可以和html这样表现技术一起下载,没有用户延迟感,这就是为什么Java applet被Javascript/ajax替代的根本原因,所以,超文本成为REST一个基本约束。 在这篇文章中,ROy提了6个REST框架ROF必须具备的条件,这也是我们架构选型必须注意的,否则选出来的就不是真的RESTful,有时间我会按照这6个意思将Jdon框架拓展到真正的RESTful,现在一些框架以为支持CRUD就成了RESTful,其实都是假的,皮毛而已。 我纠正一下,超文本应该是html之类具备媒体资源导航功能的语言,不一定是html,超文本包括信息发布和控制,控制这块应该是由类似javascript来完成。 REST系统集成优势,所谓系统定义也是可变化的,REST应该理解为状态集成,一个系统可以是一个状态,但是一个系统内部可以由很多状态组成,因此,从状态角度将任何软件系统进行切分,这是REST的一个独特视角。 目前没有REST情况下,终端用户到请求处理服务器之间已经可以做到超文本驱动了了,就是HTML中包含某个连接,点击连接下一个页面又包含其它的连接。。。。你的意思是不是服务器和服务器之间的调用还没实现超文本驱动? 是的,不但服务器与服务器之间,而且RIA和服务器之间都要从浏览器html这样大道至简的架构中吸取力量,如果将来这些架构之间以及这些系统内部都使用REST,那就是一个真正的互联互通目标了。 如果网络上的通讯都是超文本,那么会导致问题就是 1 粗粒度和数据通讯接口 2 困难的错误调试 3 与面向对象技术的冲突 4 更长的开发和排错周期 数据通讯接口可不像浏览器一样,浏览器接到错误的标签,无非就是某个格没对齐,而如果一切都是文本,那么未来某两个服务器之间文本出些许差错可能导致整个系统不预期的灾难性后果,文本块越大可能隐藏的潜在风险越多,确信带来的资源位置无关性的优势相对于这些劣势是值得的??? 其实超文本就是XML,Html也是一种XML,只不过这个XML中必须有与具体状态对应的资源URI。 而SOAP等基于XML的则是服从于组件服务粒度,而不是从客户端状态来考量的,这完全是两个不同方向。 所以,RETS是SOAP/Web服务的升级,如果超文本有什么问题的话,那么SOAP/Web服务体系架构就会有问题。 关键是对REST真正理解,ROY自己也发感概,为什么这么多人误解了REST意思?都误读了呢? 他认为REST只是一个基于几十年的发簪经验,谋求让软件获取更长寿命的一个方法,但是更多人比较擅长短视方法,忽视甚至否定长期方法,这就是误读和矛盾所在。 我本人也崇尚软件是有生命的,所以才能长期活着的宗旨。 当我第一次听到REST这个概念的时候,我被怔住了,为什么呢?因为我觉得自己太浅薄了,计算机以及计算机网络是一个太过于神奇的东西。 状态表述转移 在REST的世界中,资源即状态,而互联网就是一个巨大的状态机:每个网页是其一个状态;url是状态的表述;REST风格的应用则是从一个状态迁移到下一个状态的状态转移过程。早期互联网只有静态页面的时候,通过超链接在静态网页间浏览跳转的page->link->page->link…模式就是一种典型的状态转移过程。 也就是说早期的互联网就是天然的REST,直接的表明我们现在都偏离了这个概念,偏离了互联网这个REST初态!我们为什么要这么做?我们为什么会在偏离REST之后的这几年开始重新审视这个概念?重视它? 无状态服务器 REST风格应用可以实现交互,但它却天然地具有服务器无状态的特征。在状态迁移的过程中,服务器不需要记录任何Session,所有的状态都通过url的形式记录在了客户端。PS:更准确地说,这里的无状态服务器,是指服务器不保存会话状态(Session);而资源本身则是天然的状态,通常是需要被保存的;本文提到的无状态服务器均指无会话状态服务器。 所有的状态都通过URL的形式记录在客户端?我们的购物车代码可以删除了,完全可以通过URL来表达?原来服务器费尽心思在无状态协议http上做的session都可以废掉了?JdonFrameWork,Seam,EJB中的状态管理组件相对REST是矛盾吗?banq在把jdon框架拓展为真正的RESTful的时候会保留Stateful这个Annotation吗?
ζ浮云¢惊龙 2009-07-14 13:45
REST架构实质 REST(Representational State Transfer) 曾经被误解为只是CRUD(增删改查),从这个层面上,好像REST只是和RPC一个层面的东西,没有什么了不起,其实这些都是对REST误读。 理解REST需要从系统集成整合以及架构的伸缩性方面入手,这方面有一篇很重要的REST博文: I finally get REST. Wow. http://www.pluralsight.com/community/blogs/tewald/archive/2007/04/26/46984.aspx 作者认为:每个通讯协议都有一个状态机,当你使用RPC时,你要做些方法来改变通讯的状态,但是这些状态是封装在服务器端或客户端的专门通讯模块中,比如通过Hessian/SOAP等Proxy技术进行RPC调用,虽然可以在客户端很方便地象调用本地服务一样,缺点总是伴随优点到来,由于Proxy封装了客户端和服务器的通讯,就很容易让客户端和服务器紧耦合。 这其实是C/S架构的一个本质问题,而B/S架构通过简单的浏览器则解耦了客户端和服务器的耦合,别小看丑丑的浏览器,特别是当初还没有AJAX辅助时,浏览器被很多传统C/S讥笑和不屑,但是他们不知道B/S架构后面蕴含的深刻朴实的设计道理,是真正大道至简。所以,当我们重新回归RIA富客户端代表的C/S架构时,必须吸取Web架构的本质优点,这样才是螺旋式上升。 回归话题,由于传统架构隐藏了通讯模块进而发生了紧耦合,而REST最大作用则是将通讯状态以URI显式表现出来,也就是将通讯状态的透明性,这样做最大的好处就可以在通讯环节引入伸缩性。 REST核心思想就是:以URI形式将状态机表现为动态的节点图,我们就能引入动态负载平衡dynamic load-balancing, 数据重导向data-directed-routing, versioning 等其他正常的Web底层设计架构Web infrastructure,从而使客户端和服务器之间服务器之间享受Web架构的好处。 谈到系统集成,SOAP/Web服务/SOA被厂商吹嘘了很多年,很多应用也在使用SOAP,SOAP和REST无疑是相互竞争的,SOA其实也是一种的RPC,是一种基于XML的RPC,因此,同样存在通讯状态隐藏的致命问题。 上述博客作者写了另外一篇文章来比较(http://www.pluralsight.com/community/blogs/tewald/archive/2007/04/27/47031.aspx) 比如,两个城市之间航班看成一个协议,这个协议有下面几个状态: <ready> - searched (查询) - retrieved details (获得细节) - reserved (预订) 通过URI表现出来是: <none> - http://quuxTravel.com/searched - ??? depends on previous state - ??? depends on previous state 客户端通过get方式http://quuxTravel.com/searched?src=London&dest=NYC进行查询,得到结果如下: <itineraries> <itinerary src=“London“ dest=“NYC“ price=“400.03“> <getDetails uri=“http://quuxTravel.com/details?itinerary=402“ /> <reserve uri=“http://reservations.bookingsunlimited.com/quuxTravel?itinerary=402“ /> </itinerary> <itinerary src=“London“ dest=“NYC“ price=“109.88“> <getDetails uri=“http://quuxTravel.com/details?itinerary=219“ /> <reserve uri=“http://reservations.bookingsunlimited.com/quuxTravel?itinerary=219“ /> </itinerary> </itineraries> 客户端目前处于“查询”状态,通过遍历上述itineraries旅游线路结果集合,寻找出最便宜的一家,如果用户想查询一个不在上述结果的信息比如飞行总体时间,他能通过上述结果属性getDetails/@uri中保存的URI信息再次GET获得,这样就会切换到 retrieved details状态。然后又会回到searched状态。 当用户选择一条路线后,通过保存在reserve属性中的URI值就进入 reserved状态,客户端得到一些reserved方面的信息,至此,整个业务算完成了。 如果使用RPC如何来完成呢?我们必须创建一个接口如下: interface IFlightSystem { Itineraries Search(string src, string dest); Details GetDetails(int itineraryId); Confirmation Reserve(itineraryId); } 客户端可以通过调用这个接口的几个方面来完成上述一些业务. 在这里,接口表达了和前面REST同样的协议,所不同的是, RPC客户端依赖服务器端这个接口,也就是两者通过接口耦合了,更致命的是:searched (查询) retrieved details (获得细节) reserved三个状态耦合到同一个服务器中,如果我们想将这三个状态分离分散到多台服务器上,除非重写服务器端代码,否则无能为力。 而在前面REST调用中,每个状态都是通过URI重新定位,这样,我们可以在这三个状态中引入伸缩性,比如searched状态的URI在A服务器,而retrieved details的URI则是B服务器的网址,而reserved的URI则是c服务器,看看我们的业务不再是铁板一块了。 这就是REST本质魅力,REST和RPC/SOAP本质区别是透明性。REST透明性可以让我们以更细粒度引入伸缩性,这样以REST为主要形式可以组建一个分布式的大型架构,而这个目的恰恰是重量解决方案SOA提出的目标,现在我们有了另外一个轻量的选择。
ζ浮云¢惊龙 2009-01-10 13:55
[banq]
总结一点:从myspace看更加验证,数据库是软件系统的瓶颈,而且最不可伸缩,一旦数据库成为系统瓶颈,就得动大手术,实现架构上的变迁,这是伤筋动骨,变迁人员压力巨大的。另外由于是社区,就是变迁数据丢失也没什么大不了,如果是企业那就......
http://www.jdon.com/jivejdon/forum/messageList.shtml?thread=34551&message=23116484#23116484
ζ浮云¢惊龙 2008-09-18 12:59
!!!大讨论:程序如何监视数据库的变化----来者有分楼主wnchg(温水青蛙)2002-05-28 16:09:21 在 PowerBuilder / 数据库相关 提问
我的程序要监视数据库所有表的变化情况,如何实现?
现在我用的方法是:给每张表做一个触发器,作用是当表有变化时,往特定的一张表my_systable写入一条记录,我的程序定时扫描表my_systable,但这样开销太大。
有没有更好的方法?
欢迎参加讨论!
问题点数:0、回复次数:122
Top


1 楼jackygan(一剑飘香)回复于 2002-05-28 16:12:18 得分 0 如果是SQLSERVER的话,他本身看带的profile里有一个自动监视,很多用的。
Top

2 楼far_ranging(大路)回复于 2002-05-28 16:23:33 得分 0 一般来说都会有一些系统表,你定时查看系统表就行了。不同的数据库系统表也不相同。
Top

3 楼kaikaihe(开开)回复于 2002-05-28 16:25:49 得分 0 寻找工具解决
Top

4 楼lws0472(期待2008)回复于 2002-05-28 16:33:01 得分 0 每个数据库都有自己的日志文件,后缀基本都为.log,不同的数据库日志文件也不一样,你查一下就可以了
Top

5 楼wnchg(温水青蛙)回复于 2002-05-28 16:36:41 得分 0 to: jackygan(一剑飘香):SQLSERVER的profile可以与我的程序通信么?
to: kaikaihe(开开):有没有不采取循环监视的工具?
Top

6 楼wizardinred(红袍法师)回复于 2002-05-29 14:01:13 得分 0 我也想知道,期待中....
Top

7 楼blue_tear_11(blue_tear_)回复于 2002-05-29 14:07:14 得分 0 我不知道,所以来看看
Top

8 楼jackygan(一剑飘香)回复于 2002-05-29 14:09:15 得分 0 SQLSERVER的profile里会把记录存为文本,你用程序去访问这个文本就可以了。
Top

9 楼programbcb(datawindow)回复于 2002-05-29 14:13:48 得分 0 pb中不好作,有谁知道这个原理的
比如在网络游戏中,一个人的走动会在其它任何一起玩的人的电脑中走动一样
这是如何实现的?
Top

10 楼wnchg(温水青蛙)回复于 2002-05-29 14:21:01 得分 0 (一剑飘香) profile是SQLSERVER中的工具吗?SQLSERVER个人中文版里有吗?

Top

11 楼jackygan(一剑飘香)回复于 2002-05-29 14:48:22 得分 0 有啊,是profiler,上面我写错了,具体说明参看MSSQL的书籍。
Top

12 楼jimly(jimly)回复于 2002-05-31 00:20:06 得分 0 用其它方法的开销恐怕只会更大。
再有就是不知你监视的目的,是监视谁改了数据,还是监视数据库的性能参数
是否需要调整?
Top

13 楼SOFTFUN_CSDN(不知所云~)回复于 2002-05-31 00:23:07 得分 0 1、这是DBMS的范畴,通用的实现做起来比较复杂,因为不同的DBMS差异较大;
2、一般DBMS都提供有此功能;
3、用触发器是很不现实且笨的方法;

Top

14 楼xiaoxianhe(笑仙鹤)回复于 2002-05-31 00:24:37 得分 0 期待答案。
Top

15 楼wnchg(温水青蛙)回复于 2002-05-31 16:52:29 得分 0 to:jimly(一脚) 我主要是要监视某些特定的表,当这些表发生变化后,让程序(而非手动)按照一定顺序去对修改相关的表。
Top

16 楼ouyi2002(即查即用-摘星计划)回复于 2002-05-31 17:12:09 得分 0 不是有一个数据库日志文件吗?就是那个后缀为*.log的文件。
比如你有一个名为AAA.db的数据库,在同一路径下一定存在一个名为AAA.log的日志文件,这个文件就是用来记录数据库的改变情况的,必要的时间可以用它来对数据库进行恢复。
Top

17 楼pei322(灵瞳)回复于 2002-05-31 17:15:13 得分 0 学习学习
Top

18 楼ouyi2002(即查即用-摘星计划)回复于 2002-05-31 17:21:10 得分 0 如果是监视一张表,我有一个主意,你新建一张表,结构和被监视的表一样,只是表名不一样。然后为被监视的建立数据窗口,将它的删除和修改缓冲区中的数据写入新建的一张表中,这时新建的一张表就用来记录被监视表的修改情况。(这种做法有一个前提,就是你的被监视表一定要用数据窗口进行操作,不用直接用SQL语句来操作。这样被监视表的修改情况才能被记录下来)。
  这种做法我以前已经成功地做出来了,不知哪位高人还有没有更好的方法?
Top

19 楼zhanwei(@_@,初学.Net)回复于 2002-05-31 17:28:18 得分 0 我建议楼主看一下PFC的DEBUG Service的处理方式,可以监测所有的执行的sql语句,包括嵌入式和数据窗口的,在这没法很详细的解释,自己先看看吧!
Top

20 楼wnchg(温水青蛙)回复于 2002-06-01 16:34:55 得分 0 To: zhanwei(白天不上CSDN) 恕我拙笨,请问何为“PFC的DEBUG Service的处理方式”

TO:ouyi2002(林月如(言而有信);问题是要监视的表不是由我操纵的。

谢谢大家的捧场,日后结贴,
鄙人当总结最好的方法。贴出备考!
Top

21 楼ddtid(竹雨)回复于 2002-06-01 16:45:50 得分 0 说了要给分的啊
我不知道
Top

22 楼sunsg()回复于 2002-06-02 16:23:56 得分 0 你说的方法也可以,不过可以定期的清除以前的数据,只保留最近一周的数据
Top

23 楼oceanaut(海阔天空)回复于 2002-06-03 11:08:34 得分 0 具体我也没有做过,:)
Top

24 楼sydeng(new海)回复于 2002-06-03 11:47:44 得分 0 to:wnchg
知道了,告诉我,谢谢。
sydeng@371.net
Top

25 楼cqulzh(Eexcelence)回复于 2002-06-03 13:17:24 得分 0 再次学习……
Top

26 楼wnchg(温水青蛙)回复于 2002-06-04 18:37:58 得分 0 转发grey_whp有关监视数据源的的发言

————————————————————————-
grey_whp(小跑) :
先写一个触发器,在ORACLE中,调用外部C++程序,将windows常用的3个DLL联编到自己的程序里,这用就可以通知窗口了。

发送者 grey_whp 发送时间 2002-6-3 22:40:11
前几天和我的同事遇到了类似的问题,她是用一个触发器去触发ORALCE一个外部调用,有外部调用去向一个指定的窗口发消息,然后就实现了数据库更新时的自动通知功能。
你可用到的windows中的几个动态连接库,是KERNEL32.dll,user32.dll另一个我忘记了,他们在winnt\system32下。

Top

27 楼xiongxiao(小雄)回复于 2002-06-12 10:15:22 得分 0 关注
Top

28 楼yufeng777(yufeng)回复于 2002-06-12 15:27:54 得分 0 学习
Top

29 楼tiantianpb(第一菜鸟!)回复于 2002-06-12 20:11:12 得分 0 学习,再学习,努力再努力
Top

30 楼wnchg(温水青蛙)回复于 2002-06-12 20:51:44 得分 0 等待,再等待,等待再等待
Top

31 楼Leony(老树)回复于 2002-06-13 17:02:07 得分 0 学习
Top

32 楼roor(宝蓝)回复于 2002-06-14 07:58:53 得分 0 学习ing
Top

33 楼pzjy(朱建永)回复于 2002-06-16 04:07:17 得分 0 up~~~~~~~
Top

34 楼rakeliu(老牛)回复于 2002-06-16 09:34:49 得分 0 提一个思路,不知有用没用!
我做过一个类似复制服务的小程序,就是使用触发器,记录表名、主键条件字穿,定期查询这张表就知道是否有数据修改。
Top

35 楼wnchg(温水青蛙)回复于 2002-06-18 10:59:28 得分 0 定期查询这张表--- rakeliu(老牛) 是在程序里用循环做吗?
Top

36 楼wk_1978()回复于 2002-06-18 12:37:14 得分 0 up
Top

37 楼jmsofts(jmsofts)回复于 2002-06-18 14:59:48 得分 0 gz
Top

38 楼wnchg(温水青蛙)回复于 2002-06-19 22:10:00 得分 0 欢迎各位提出宝贵意见,

也请帮忙up一下贴子。
Top

39 楼ben_4(二水)回复于 2002-06-19 22:39:57 得分 0 强烈关注
Top

40 楼put(干劲)回复于 2002-06-21 13:03:46 得分 0 关注 关注
Top

41 楼jianghuxing(回头看看原来我一无所有)回复于 2002-06-27 17:19:35 得分 0 我已有一个点点思路,那位仁兄还有高见呀。

谈谈,在谈谈。

Top

42 楼siyuancxl(思远)回复于 2002-06-27 18:59:54 得分 0 jackygan(一剑飘香) 说得很对,
如果是SQLSERVER的话,他本身带的profile里有一个自动监视,很有用的。
所有的sql语句都能监视到!



Top

43 楼zqllyh(学习Stupid As Pig中...)回复于 2002-06-27 20:02:22 得分 0 关注
Top

44 楼oftenfail(静静的等待)回复于 2002-06-28 08:48:21 得分 0 学习
Top

45 楼wallis(豆子)回复于 2002-07-09 12:50:14 得分 0 up
Top

46 楼wallis(豆子)回复于 2002-07-09 12:50:52 得分 0 up
Top

47 楼hjd_cw()回复于 2002-07-09 13:38:03 得分 0 我正在做这样的东西,原型已经搞定了!
Top

48 楼wnchg(温水青蛙)回复于 2002-07-10 08:57:54 得分 0 欢迎发表意见
Top

49 楼webcat()回复于 2002-07-10 09:08:34 得分 0 关注
Top

50 楼zry_ykfh(zry)回复于 2002-07-10 10:25:38 得分 0 关注
Top

51 楼pb_yu(pb鱼)回复于 2002-07-10 11:20:00 得分 0 同意 ouyi2002(林月如(言而有信)) 方法,
我以前用过同类方法解决过类似问题。

另外:还可以建立一个日志表,在程序执行中用编程方式将各种操作 用户+执行的SQL+及数据等信息insert日志表中,定期检索此表。

以上方法只适应对单个表或极少数表有目的的进行监视



Top

52 楼bestlea(牙白)回复于 2002-07-10 11:48:20 得分 0 我不知道你是想监视每张表的数据变化呢,还是哪些表被修改过的?
Top

53 楼bestlea(牙白)回复于 2002-07-10 11:52:04 得分 0 我不知道你是想监视每张表中的数据变化,还是想监视哪些表有被改动过?请告知,我下午再来!
Top

54 楼szpqq(Gavin)回复于 2002-07-10 11:59:17 得分 0 学习
Top

55 楼GuoYangHai(Charles.Guo)回复于 2002-07-10 12:14:45 得分 0 修改某些特定的表成功後,馬上去修改其它的表
Top

56 楼wallis(豆子)回复于 2002-07-11 17:53:27 得分 0 学习。
Top

57 楼wnchg(温水青蛙)回复于 2002-07-12 18:07:27 得分 0 To: bestlea(牙白)
我要根据各个表的变化情况,来维护相关的表,以保持数据的一致性。顾而要监视每张表中的数据变化。
Top

58 楼hjd_cw()回复于 2002-07-14 11:56:29 得分 0 sybase 里可以用 monitor server。
Top

59 楼netdog0399(四君子)回复于 2002-07-14 12:23:05 得分 0 我想的话,不同的数据库有不同的对表变化监视的工具!但是有PB来实现我还是要看高手如何解决的了!
糊涂蓝:)
虽然生活在同一个世界里,但却被一面玻璃墙隔开。在彼此的世界里面,我可以看到你在哭,你可以看到我在笑,但是我永远也无法感触到你的体温,就像你永远也无法感觉到我的心跳。

Top

60 楼sun9761(bobi)回复于 2002-07-14 18:47:22 得分 0 我建议去看《sql数据库系统管理与开发指南》里面又sql数据库的工作模式和他的工作运行状态的分析。剖析了数据库的工作。触发器和存储过程都有。可以看看。
Top

61 楼byry(百事罐头)回复于 2002-07-17 08:49:44 得分 0 在数据库端做触发器最好,写存储过程也可以,在客户端用程序实现也可以,不过这样会加重客户端的工作,而且不利于数据库的一致性,完整性,以及数据库恢复和并发控制.
Top

62 楼xirumin(吃好喝好)回复于 2002-07-17 09:43:48 得分 0 如果有很多表,还是用DBMS自带的功能,最好不要另出机注,很费力又不讨好
Top

63 楼wnchg(温水青蛙)回复于 2002-07-17 18:38:06 得分 0 xirumin(雪山飞剑) ,什么叫“另出机注”?
Top

64 楼bestlea(牙白)回复于 2002-07-18 21:57:09 得分 0 最好的方法,也是最麻烦的方法就是对表建立check机制。
Top

65 楼muzi(muzi)回复于 2002-07-19 23:19:06 得分 0 关注中!
Top

66 楼pb_yu(pb鱼)回复于 2002-07-20 00:04:02 得分 0 To: bestlea(牙白)
我要根据各个表的变化情况,来维护相关的表,以保持数据的一致性。顾而要监视每张表中的数据变化。

我认为楼主问题是保持数据的一致性, 所以还是要看楼主的系统是如何规划的,以及各表之间数据关系。如果系统异步实现数据的统一足够,那么编写存储过程定时触发异步实现数据的一致性,毕竟同步实现太消耗系统性能,而且数据库也不稳定,也不一定可靠。
Top

67 楼bestlea(牙白)回复于 2002-07-20 09:13:02 得分 0 to pb_yu(pb鱼)

你有没有想过异步实现数据数据的一致性在一定程度上反而不一致吗?比如说,一用户在检索数据时,你所用的异步触发还未发动,此时的数据就会不一致的。
Top

68 楼tiger7403(好兵帅克)回复于 2002-07-20 10:02:05 得分 0 关注
Top

69 楼bad_good(温柔一小刀)回复于 2002-07-20 10:13:24 得分 0 写存储过程也可以,在客户端用程序实现也可以,不过这样会加重客户端的工作,而且不利于数据库的一致性,完整性,以及数据库恢复和并发控制.

Top

70 楼banalman(IT解放者)回复于 2002-07-20 11:50:59 得分 0 肯定数据库系统的系统表中有的
Top

71 楼bestlea(牙白)回复于 2002-07-22 08:42:33 得分 0 我们考虑得太多了,我认为不管怎么实现,只有服务器端或客户端只要有能力支持实现过程,那么就不算对系统增加了额外的资源。
Top

72 楼liulee(流方)回复于 2002-07-22 21:34:23 得分 0 若是用户级的监控,可以用 PFC的services来解决,实际上就是把transaction的语法全部截获下来。

若是服务器端的监控,若不怕开销,可以用触发器的方法;

若想别的方法?我觉得有下列可能:
1、独立程序,侦听服务器的侦听端口,若无法侦听则考虑钩子钩一下;
2、解析协议,把所有对该端口的操作全部地,统统地记录下来。

这几乎是邮件级的,所以难点在于协议的解码,若知道了,则没有更多的技术难点了。


Top

73 楼cjc79(岁月无痕)回复于 2002-07-22 22:04:38 得分 0 你这么多人来,我也凑了数!
Top

74 楼wangsj_zj(藤)回复于 2002-07-24 12:39:20 得分 0 启用pfc的提供的sql 的监视工具sql spy,将所有信息写入到指定的日志文件中
Top

75 楼771218(forit)回复于 2002-07-24 12:48:43 得分 0 一定要监视吗?不能在触发器里直接写吗?
Top

76 楼SummerHeart(夏夜之怀)回复于 2002-07-24 13:49:38 得分 0 学习 。wnchg(wnchg) 有了结论请贴出来让大家学习学习。
Top

77 楼renmao(晓晓)回复于 2002-07-24 13:55:39 得分 0 关注:我也很想知道的,大家能不能具体点!这个问题很值得讨论!
Top

78 楼joss(季节...夏至)回复于 2002-07-24 15:19:22 得分 0 去数据库基础版问问吧
直接找到他们版主也行
他们对这方面讨论得多一些
应该会有好结果
!!^^
Top

79 楼newhumanegg(新新人类)回复于 2002-07-24 23:04:26 得分 0 这个问题比较棘手,回去看看!
Top

80 楼TianChong(*︿_︿* ○Ооo○泡泡oо㊣VC高手群:2997669)回复于 2002-07-25 02:36:49 得分 0 用FPC的services或用SQLSERVER的profiler如果数据不是很多的话,其实用触发器也无所谓啊。
Top

81 楼wnchg(温水青蛙)回复于 2002-08-02 15:11:36 得分 0 欢迎继续讨论。
Top

82 楼LJYWZ(艳阳天)回复于 2002-08-04 22:07:58 得分 0 为什么不用触发器呢?
Top

83 楼scu96124678(冰河)回复于 2002-08-15 10:41:40 得分 0 学习学习在学习
Top

84 楼jlandzpa(jlandzpa)回复于 2002-08-16 11:55:57 得分 0 触发器就是干这种事的,它的效率肯定比你自己实现高的多.
Top

85 楼zsl208(zsl)回复于 2002-08-24 17:47:52 得分 0 同意jlandzpa(ORA-00600)的观点
Top

86 楼bad_good(温柔一小刀)回复于 2002-08-28 19:34:11 得分 0 up
Top

87 楼zenglong(zenglong)回复于 2002-09-02 14:39:34 得分 0 好象除了用触发器,和存储过程外,要与自已开发的程序通信,没有什么更
简便的方法了。
Top

88 楼ao(皮卡丘)回复于 2002-09-02 19:53:28 得分 0 up
Top

89 楼dzhcheng(逸枫)回复于 2002-09-02 20:22:48 得分 0 学习!
Top

90 楼shahand(死磕)回复于 2002-09-02 20:47:38 得分 0 如果要返回到客户端一个信息,怎么样做呢?
Top

91 楼jianlinlong(楚 潇)回复于 2002-09-03 10:40:37 得分 0 up
Top

92 楼xing_xing(流星)回复于 2002-09-03 10:54:47 得分 0 关注!
Top

93 楼junhao(白衣飘飘的年代)回复于 2002-09-03 11:20:54 得分 0 to wnchg (wnchg):
有结论后能给我发一份过来吗,我也正好遇到同样的问题,我的email是:zhang-junhao@21cn.com,非常感谢!
Top

94 楼wj_mailbox(aaa)回复于 2002-09-03 11:40:52 得分 0 数据库自带工具
Top

95 楼wkliangsdqd(天元)回复于 2002-09-03 13:16:26 得分 0 同上
Top

96 楼smilelhh(blue)回复于 2002-09-03 14:04:54 得分 0 用审计是不是要比触发器要效果好点\?
Top

97 楼ShuiZhongYue(水中月)回复于 2002-09-06 17:58:13 得分 0 用审计是最好的办法!

具体方法请参照相关的数据库书籍。
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]


Top

98 楼ozl(糊涂虫)回复于 2002-09-06 18:11:58 得分 0 学习学习
Top

99 楼bluewinder(蓝风子)回复于 2002-09-06 18:14:18 得分 0 学习
Top

100 楼wnchg(温水青蛙)回复于 2002-09-11 10:07:41 得分 0 有谁能具体说说审计吗?我刚听说。
Top

101 楼ccc520(ccc)回复于 2002-09-11 12:53:02 得分 0 学习
Top

102 楼szpqq(Gavin)回复于 2002-09-11 12:59:59 得分 0 up
Top

103 楼softdear(softdear)回复于 2002-09-11 13:26:54 得分 0 我觉得楼主的用意主要是自动更新相关表,因此用触发器比较好
Top

104 楼Jingxh(赤脚)回复于 2002-09-11 14:14:36 得分 0 gz
Top

105 楼linwancai(小林)回复于 2002-09-15 23:05:35 得分 0 我正在准备解决双机热备用的数据库同步和数据库镜像问题,如有结论,请给我e-mail一份:wancai@21cn.com
先谢了!
我到时也给你一份我们的分析报告和算法设计。
Top

106 楼yaoyuan(遥远)回复于 2002-09-21 09:49:17 得分 0 提高ing..............................
Top

107 楼bravebarbarian(野蛮人)回复于 2002-09-22 11:03:02 得分 0 up
Top

108 楼hy_ghb(新的生活)回复于 2002-09-23 22:52:14 得分 0 对表的操作我想都是通过程序操作的,可以在操作表时写想应的sql语句记下所操作的信息,写入一个表中,以达到对数据中所有表的监视。
Top

109 楼hongqi162(失踪的月亮)回复于 2002-09-24 08:33:14 得分 0 up
Top

110 楼Hi_greece(无招胜有招)回复于 2002-09-24 09:10:17 得分 0 up
Top

111 楼888888888888(888888888888)回复于 2002-09-24 11:08:16 得分 0 触发器或存储过程
Top

112 楼chinatpsys(黑侠)回复于 2002-10-04 19:06:54 得分 0 学习学习
很有意思研究中..................................
Top

113 楼lovingyyw(坏小子)回复于 2002-10-04 20:15:36 得分 0 我是来要分的 呵呵
Top

114 楼fengzeng(风之子)回复于 2002-10-04 22:21:43 得分 0 关注!!!
Top

115 楼help2002(密码)回复于 2002-10-08 11:14:24 得分 0 为什么不用触发器?
Top

116 楼msf(飞黄腾达)回复于 2002-10-10 20:14:26 得分 0 ok
Top

117 楼l680103(l680103)回复于 2002-10-10 20:52:29 得分 0 用TIMER 隔一定时间扫一遍得了
Top

118 楼cyliu2000(开垦者)回复于 2002-10-11 08:43:10 得分 0 up

Top

119 楼norman211314(IT民工)回复于 2002-10-11 08:54:58 得分 0 没错,用触发器应可以实现的。
Top

120 楼sarvio()回复于 2002-10-11 09:24:04 得分 0 收藏
Top

121 楼chengjian(程剑)回复于 2002-10-11 09:59:10 得分 0 我也认为:用TIMER 隔一定时间扫一遍得了

Top

122 楼xiaoxianhe(笑仙鹤)回复于 2002-12-09 00:31:16 得分 0 学习……
Top

123 楼fengzeng(风之子)回复于 2003-01-02 12:15:56 得分 0 pb如何调用INTERBASE数据库的存储过程,再线等待

输入参数: IZYH VARCHAR(8)
IHISCFID DOUBLE PRECISION
ISJ DATE
IYS VARCHAR(10)
IZL VARCHAR(10)
IKS VARCHAR(30)
ζ浮云¢惊龙 2008-09-01 10:44
cronExpression配置说明

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /


表达式 意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

特殊字符 意义
* 表示所有值;
? 表示未说明的值,即不关心它为何值;
- 表示一个指定的范围;
, 表示附加一个可能值;
/ 符号前表示开始时间,符号后表示每次递增的值;
L("last") ("last") "L" 用在day-of-month字段意思是 "这个月最后一天";用在 day-of-week字段, 它简单意思是 "7" or "SAT"。 如果在day-of-week字段里和数字联合使用,它的意思就是 "这个月的最后一个星期几" – 例如: "6L" means "这个月的最后一个星期五". 当我们用“L”时,不指明一个列表值或者范围是很重要的,不然的话,我们会得到一些意想不到的结果。
W("weekday") 只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第16 天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在day- of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日。
# 只能用在day-of-week字段。用来指定这个月的第几个周几。例:在day-of-week字段用"6#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。
C 指和calendar联系后计算过的值。例:在day-of-month 字段用“5C”指在这个月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在这周日或之后包括calendar的第一天。


在MONTH和Day Of Week字段里对字母大小写不敏感
黄啊三 2008-07-30 17:00
折磨你一天换来折磨我们只2小时,谢谢
共3页: 1 2 3 下一页