disruptor源码
‘壹’ 为什么 MySQL 使用多线程,而 Oracle 和 PostgreSQL 使用多进程
.NET平台很棒。真的很棒。直到它不再那么棒。我为什么不再用.NET?简单来说,它限制了我们选择的能力(对我来说很重要),转移了我们的注意力,使得我们向内认知它的安全性,替代了帮助我们认知外面广阔世界的所有可能性。[系好安全带:这个文章的长度几乎成了一本书…]优点首先让我开始说说.NET做得对的许多事吧,尽管这其中的大多数并不来自.NET本身,但却是由.NET社区而来。C#C#令人惊叹。我认为它是一个令人惊叹的编程语言。从强大的c语言背景而来,我彻底地喜欢其语法,流和这门语言的所带来的感觉。当然有我可能改变的事,但总体来说它是一门扎实的语言。并且基于开发人员使用的编程语言如此巨额的百分比和Windows操作系统的优越性,它是一门众所周知的语言。ReSharper我也很喜欢Resharper。在JetBrains工作的开发者们都是奇迹般的人。如果没有ReSharper和一些相关的工具,我可能并不会如此喜欢C#。BDDandMSpec我也很喜欢简称为机器规格(mspec)的BDD风格的框架。它是一个令人惊叹的测试框架,真正支持在测试中使用正确的语言测试本身。在使用mspec之前,我的测试真是一团糟并且很碍我的事。另外,当我们创建GoConvey—基于Golang的BDD测试框架的时候,Mspec对于我的组织来说是一个巨大的灵感和激励。多语言运行时我认为多语言的CLR(公共语言运行时)的观念真得使得JVM的世界思考着。我不知道任何非java的JVM语言在CLR之前,但随着“公共语言运行时”的到来,我的理解是这使得使用JVM的人们向前进并且最终创造了如Scala和Clojure这样伟大的JVM编程语言。如果我错了请纠正我。再者,CLR使得Sun公司的人们坐下来并关注它,因为Java有一点陈旧并且随着Java8的到来,仅仅现在才在多个方面追赶着。竞争是一件非常好的事。NuGet另一个显着的例子是NuGet。这个包在Windows中作为一个整体特别是在Windows的开发中,它的管理轶事是糟透的。NuGet解决了很多问题,他们也通过从Python和Ruby借用了很多东西去做了很多正确的事。有改进的余地吗?当然。但比起其他一些选择在这儿或那儿的包升级来说,我还没有感到使用NuGet有这许多痛楚。Mono对于Mono的开发者们,我不能不说太棒了。他们所创造的太惊奇了。没有任何官方支持和不顾潜在的悬在他们头上的法律问题,他们向前推进并创造了一个居然能替代官方运行时的实现。我已经有一些运行在产品中应用程序,在Mono下运行了几乎一年而没有任何问题。它的产品准备好了吗?这可能取决于你的应用程序(见下文“Mono”)。CQRS和事件溯源可以认为,关于.NET最好事之一是,它是CQRS的诞生地并有相关的技术:事件溯源。就算这样,CQRS+ES本身并没有什么很新的东西。正如GregYoung将会告诉你的,这是由一堆40年历史原料为我们重新打包并更名的。对于大型代码库我有些非常严重的问题,当我5年前使用CQRS+ES的时候,它完全释放了我的域。CQRS+ES现在是命名模式的并且其成长是显而易见的。这可能是因为.NET已经能够和其他的开发平台交互共享的原因。除了这个之外,大多数的创新是从外部来的。缺点优点先放在一边,让我们看看什么出错了和我为什么不再用.NET框架。关于我最近开发平台的迁移,最能激励我的事是我可以利用许多最好的部分而丢下不好的部分(如下文所说)。Windows正如前文所述,当面对基于网络的服务器软件时,Windows并不是一个好的选手。在我看来,Windows的另一个真正的大问题是传统的Windows开发者是通常仅仅擅长于Windows,当他们离开安乐窝之后就会很快迷失,这对于linux开发者来说却不是问题。计算远不止是Windows。开发者仅仅能操作单一的操作系统的一个问题是它不可避免得导致Windows的激增。换句话说,Windows生了Windows。没法打破这个循环。另一方面,*NIX的开发者通常熟悉多操作系统(Linux,Unix,OSX,Windows等等),一个操作系统的内部工作原理,不同的分布(基于Debian和基于Fedora),窗口管理器,桌面管理器,文件系统,包管理,编译,重新编译,重新打包,命令行“fu”等等。我的一个心病是文件系统。NTFS并不是系统唯一的文件系统,对于任何给予的任务它几乎都不是最好的选择。ZFS,BTRFS,ReiserFs,ext*等等,有一些很酷的特性。我也很喜欢为了各种高速/透明的磁盘操作,能从BASH创建回路设备或者创建RAM设备。这在Windows中不会发生—如果没有第三方软件的话。在AWS云服务中,启动一个Windows机器要花掉足足10多分钟。我大约15-20秒就能启动一个简单的Linux机器。当涉及到云计算规模,它能够迅速扩展是很重要的,因为当扩展很重要时,10-15分钟就像是永恒的。VisualStudio在我这另一根刺,当属VisualStudio。我需要一个大大超出预期的IDE去做任何开发,这个想法困扰着我。它只是如Windows一样庞大的资源猪。我有一个内核i73770K3.5GHZ的台式机,以16GB的内存和最大4512GB的固态硬盘去编译。它差不多刷爆了Windows体验指数,但Windows+VS仍然很慢。(是的,ReSharper使得它更慢了,但是ReSharper对这来说是值得的。)现在我在MacBookPro上开发,它比起我的强大的台式机来说只有更少的CPU马力,但运行明显更快,在一个短小的学习曲线之后,UX(用户体验)变得无限美好了。事实上,我甚至不再用鼠标了—我的双手一直在键盘或触控板上,我可以用手势操作我的电脑并让它回应—不像在Windows。关于VS很酷的一个事是调试器。它的查看和使用,令人难以置信得方便。每隔一段时间会在监视窗口报告错误的值,导致花费时间去调试。同时,这也是很大的负面,因为CLR默认的,多线程的世界使得我一开始就需要一个调试器。没有调试器是一个解脱的体验,因为它迫使你以另一种方式编程。VS同样也有创建“csproj”和“sln”文件的坏毛病。我恨这些。当然,C#必须知道编译什么和何时编译。我理解这点。在Golang中,引用在代码中使用了很重要的语句。如果它不是.NET中用到的工程文件,我可能使用简单的文本编辑器编码C#,并且对这门语言更流畅。使用gitrebase操作时,这些文件也有导致合并冲突。别让我开始说换行符的差异。我不能相信直到今天我们还在处理这样的事。如果VS解决方案文件以Linux行结束符结束,通过双击它并不能载入该解决方案,因为VS解决方案文件分析器读不出它来。源代码管理幸运的是,我早就跳出了微软阵营的源代码管理(版本控制系统VSS)。我早在2000年初,在VSS无数次丢失了我的提交之后,就使用了Subversion(译者注:Subversion是开源的版本控制系统)。之后git(译者注:git是开源的版本控制系统,内容管理系统等)出现了,我又迷上了它。不幸的是,没有Windows的接口—对我来说是典型的遭遇。最终有人创建了一个接口,我就用了那个并且没有回头。Git是一把非常锋利的刀,但当你正确运用它的时候,它是一个强大而高效的工具。我曾经在一个小工程中用过TFS(译者注:TeamFoundationServer,工作流协作引擎),它是一个怪物—和所有来自Redmond(译者注:美国微软总部)的产品一样。它感染了我的项目文件并且污染了我的源代码目录。真可恶。不,还是谢谢你。给了我任意一天用命令行git…或者可能是SourceTree,如果你需要从GUI得到一点关爱。Mono是的,这是第二次提及Mono。正如Mono本身如此惊艳一样。在.NET的世界,它仍然二等公民。无论什么时候我尝试在Mono上运行任何重要的东西,我通常都在和漏洞作斗争。幸运的是,对下载代码,查找问题,发送请求和在Linux上编译代码我没有感到不舒服。但是这件事我都记不清做了多少遍了。是的,CLR是个巨大的怪物,并且对一个非官方的应用在不同的操作系统都有相同的行为,简直是个类似于分开红海的奇迹。但事实是,我不得不花费如此多的时间来填补漏洞以使我的代码能够正确运行,实在是很难为其辩护。Mono的特定区域也慢。也许它不是在慢在过载,但对我来说Web服务器是关键所在。并且它非常慢,最后,慢到了最底下—即使是微不足道的东西。我想好消息是它只能从这儿得到更好的。我也应该提及Mono的开发者可能忘了Linux,比起我可能知道的还多,所以我不能太挑剔。IIS也许IIS在尝试着为太多的应用程序做太多的事情。它从作为一个web服务器变为像J2EE应用程序容器一样的应用程序宿主。它也站在慢速这一边。我猜如果我需要更高的性能,我应该编写我自己的web服务器,但我真的很想只关注我应用程序的代码。可能利用Windows事件服务器将是好的,但nginx(译者注:一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器)和其他服务器只是不喜欢在Windows中生产。虚拟的以JVM为基础的实现,例如Netty(译者注:JBOSS提供的一个java开源框架),很容易处理每秒650K+/的请求量。IIS在运行一个简单的CLR应用程序“Hello,World!”,处理大约每秒50K的请求量时就会壅塞。(有趣的题外话,参考基准开发者通过TCP套接字创建了一个简单的C#的web服务器,它能处理大约每秒120K的请求量。)狭隘的心理前些年有个运动叫做ALT.NET。该运动是全部是关于寻找我们自身之外的更广阔的开发社区以作为一个整体,并汇聚不同的部分。有趣的是,那是StructureMap、Autofac、NuGet、ASP.NETMVC和许多其它工具的灵感来源。在传统的.NET的圈子里,这个运动受到了很多的不屑和鄙视。我把这看作是,作为一个整体的社区普遍的狭隘心理和怠惰的一个极大的例证。(的确,它们中的一些可能会消失,进而以包括Redis,MongoBD还有其它的不同的技术而出现。)有这么多很棒的方案在那里。假定微软已注定是唯一正确之路的想法是荒谬的。如果是这样的话,我们就都还在使用VisualStudio的设计工具去拖放按钮和链接元素到一个WebForm的界面上,我们会设定了该按钮并且依赖ViewState以帮助我们与可怕的HTTP所带来的恐惧隔开。我从我的一个部署的代码库中最后一个WebForm中摆脱的那一天,是个光荣的值得庆贺的日子。谁又曾想过“网络控制”是个好主意?很显然我考虑过因为我喝了Kool-Aid(译者注:卡夫公司出品的饮料,这里意指明知是注定的或有危险的仍然去做,有负面涵义)并且完全接受它。它狠咬了我。见过2MB的ViewState吗?[注:当我写这篇文章的时候,原来的标题,“为什么我不再用.NET”,意味着整个.NET生态系统。标题感觉有点短于是我更新为“为什么我不再用.NET框架”。我想.NET作为一个生态系统,包括了所有的工具,工程,平台,组织还有很多开发者。这就是为什么有些更广泛的.NET社区的元素在我的这篇文章中受到抨击原因。]性能杀手C,Java和C#中典型的多线程范例都强烈推荐使用锁和互斥。对于锁来说有个隐藏的开销:它们慢得难以忍受。使用Disruptor(JVM中的无锁的环形缓存[译者注:实际上就是拥有一个序号指向下一个可用元素的数组]),你可以很容易得每秒处理20M以上的事件。在.NET中使用规定的“最佳实践”等任何超过每秒十几次的传输,都被认为是体面又好的性能表现,在这一点上来说你仅仅需要更大/更好/的硬件设备。事实上,我见过第三方客户端库(Rabbit,Couch,Mongo等等)中锁语句遍布整个代码。即使在我的代码中没有任何的并发,默认的和首选的方法都用了锁。无锁的、事件驱动的方法允许你大幅降低硬件和资金支出。大部分应用程序可以轻易地运行在两台机器上,第二台机器仅仅在冗余和失效备援时是必须的,以防因为硬件相关的问题导致第一台机器不可用的时候起作用。这个问题的另一个方面是调用网络和磁盘子系统的传统方式:同步,阻塞代码。如果你需要多个并发的HTTP请求,你需要的线程。大多数人不知道的是,为维持线程多出的1-2MB和上下文切换线程的需求,使得CPU内核消耗所有的时间颠簸在上下文切换上而不是做真正的工作。所以现在我们得到了在一个应用程序中数百或数千的线程,占用了RAM,并造成CPU停滞不前。还有个更好的方式。Netty/NIO(JVM),Erlang,Node,Gevent(Python)和Go都支持使用事件驱动的子系统操作(选择/epoll[译者注:Linux内核中的一种可扩展IO事件处理机制]/kqueue[译者注:FreeBSD的可扩展的事件通知接口])。这就意味着当等待数据包被tx/rx跨网络的时候,CPU可以自由地去做其它,重要的工作。因为JVM的成熟,Netty可以认为是做这项工作最快的,但我喜欢Go用Goroutines操作这个的方式—它简单,优雅,很容易推理,没有像意大利面条一样的回调。SQLServer作为一名.NET开发者,当你开始一个新的工程时,有一些事是你通常会去做的:创建一个新的solution将其部署到TeamFoundationServer(译者注:Microsoft应用程序生命周期管理(ALM)解决方案的核心协作平台)IIS中建立相应的网站入口创建一个新的SQLServer数据库在solution中关联EntityFramework(通常是2010年之后创建的工程)开始设计你的数据库和ActiveRecord实体在大多数情况下这不是编写代码的正确方式。当然它可能在某些情况下有效,但是作为一个“默认的架构”它并不是你想要的。为什么在我们甚至还没理解问题领域之前已经做了任何技术上的选择?这简直是本末倒置了。微软的生态系统鼓励每个人使用SQLServer。在VisualStudio中和SQLService进行交互或者使用SQLManagementStudio(和它的前身,SQL查询分析器)是如此令人难以置信的容易。这种以数据库为中心的重点,是钦定的或唯一正确的方式的一部分。它使你更加迷恋微软。厂商锁定始终对厂商来说是好的。为什么我们要如此开发?为什么我们不地考虑应用程序的行为而不是它如何存储的?现在我所有的项目都使用基于JSON的键/值存储。有了这种功能,我可以选择任何我想要的存储引擎,包括SQLServer,Oracle,PostgreSQL,MySQL,Cassandra,CouchDB,CouchBase,Dynamo,SimpleDB,S3,Riak,BerkeleyDB,Firebird,Hypertable,RavenDB,Redis,TokyoCabinet/Tyrant,AzureBlobs,文件系统中的明文JSON文件等等等等。突然之间,我们能够开始根据其优点而不是仅仅对其熟悉来选择存储引擎了。题外话:在AWSRDS的云上运行过SQLServer吗?别这么做。当然它会工作,但是一些例如复制这样最简单的事是不存在的。文章充斥着对SQLServer不能在AWSRDS上工作的引用。结论也许我在软件开发中学到的两件最重要的教训是:边界和封装的重要性(以多种形式)付出代价以得到正确的模型和抽象许多年前我恨“模型”这个词。每个人都会把它到处扔,它是一个如此过载的术语,很难理解它的含义和它为什么这么重要。就这点来说,我仅仅会说模型是对你想要封装的现实的一个有限的表示。也许最简单的例子就是地球仪的墨卡托投影了。这很确切得说明了一件事:导航。如果你在其他的事情上使用它,它并不毫无价值。如果你不专注于付出代价去使模型正确,去封装商业现实,那么没有任何技术能够拯救你。我对.NET最大的抱怨是,“唯一正确的方式”引导你远离理想的模型并把你推向关注实现细节和技术缺陷的方向。这样的关注导致技术实施渗血并且感染模型,最终导致它腐烂变质,因为它不能适应不断变化的商业需求。当这发生的时候,开发者挣扎着并蹬踢着,如同吸毒者一样,他们从一个新技术转向另一个,以期望下一个强大的技术能够治愈他们的病痛。技术本身并不是灵丹妙药,相反地,它是关于取舍和选择。只有正确地理解了商业行为并把它们封装进结构良好的,易于理解的模型中,以帮助保持技术堆栈在属于它的地方—作为一个实现细节。这就是我为什么不再用.NET框架,因为它不断地重申自己(的主张),不断地想要比它的本身的:一个实现细节。
‘贰’ ubuntu 怎么打开 sublime text
Sublime Text是个跨平台的编辑器,支持Windows、Linux、Mac系统平台,支持各种语言的代码编辑,配合上对应的插件,话上点时间学习,你将会对它爱不释手,大大的提高你的编码效率。本文将讲解在Ubuntu 14.04系统中安装SublimeText 3,并配置SublimeClang插件来配置C/C++开发环境。
1. Sublime Text 3的下载安装
到官方网站上下载64位(系统位64位)的.deb安装包(),下载后双击安装即可。安装好之后,通过命令subl即可打开程序,此时已经可以编写代码了。在开始之前建议先记下一些常用的快捷键,可参考:
2. 安装Package Control
Package Control是一个用于管理插件的好工具,可以用于安装、删除、禁用相应的插件,常用的插件都能在上面找到。其源码地址在上,安装非常方便,使用git将该代码先克隆下来即可,然后拷贝到~/.config/sublime-text-3/Packages/目录下并命名为Package Control即可。(也可以直接在github上打包下载,然后解压复制到~/.config/sublime-text-3/Packages/目录下并命名为Package Control)。
cd ~/.config/sublime-text-3/Packages/
git clone .git Package\ Control
或者打开sublime_text然后按快捷键ctrl+`(Esc下面那个键),在弹出的命令输入窗口输入下面信息回车即可:
import urllib.request,os,hashlib; h = '' + ''; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( '' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
重新启动SublimeText 3,然后使用快捷键Ctrl + Shift + p,在弹出的输入框中输入Package Control则可以看到Install Package的选项,选择它后一会儿(看左下角的状态)会弹出插件查询及安装窗口,输入想用的插件,选中回车即可。如果用于C/C++开发建议安装C++ snipptes,ConvertToUTF8,SublimeAStyleFormatter插件,具体代表什么意思一下就清楚了。
3. 安装强大的SublimeClang插件
SublimeClang是Sublime Text中唯一的C/C++自动补全插件,功能强大,自带语法检查功能,不过最近作者已经停止更新了,目前只能在Sublime Text 2的Package Control中可以找到并自动安装,在SublimeText 3中只能手动通过源码安装,其代码线在中。具体安装步骤如下:
安装相关软件
sudo apt-get install cmake build-essential clang git
cd ~/.config/sublime-text-3/Packages
git clone --recursive SublimeClang
cd SublimeClang
cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so #这一步很重要,如果你的clang库不是3.4版本的话,请将对应版本的库拷贝到internals中
cd src
mkdir build
cd build
cmake ..
make
一切成功的话将会在SublimeClang/internals目录中生成libcache.so库文件。重启Sublime Text,然后按快捷键Ctrl + `(Esc下面那个键)打开自带的控制输出,看看有没有错误,如果没有错误就说明一切OK了。接下来就是配置自己的文件了,按下ctrl + shift + p快捷键,在弹出的输入框中输入 sublimeclang settings ,然后选择带User那一行,在打开的文件中输入如下信息:
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"options":
[
"-std=gnu++11",
"-isystem", "/usr/include",
"-isystem", "/usr/include/c++/*",
"-isystem", "/usr/include/c++/4.8",
"-isystem", "/usr/include/c++/4.8/*",
"-isystem", "/usr/include/boost",
"-isystem", "/usr/include/boost/**",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
]
}
注释:我的gcc版本为4.8,如果你的不是请替换对应的版本,在#include相应的头文件后保存当前文件,在接下来的操作中将更快的提示所包含在头文件的函数或者变量。
4. 工程实例
通过菜单栏中的Project -> Add Folder To Project...把你已有的原代码目录加入到Sublime Text中,然后通过Project -> Save Project As...来保存你的项目,这样就创建好了项目。例如我的机器在/media/WinE/WorkStation/Swift中有个C++项目,代码分别放在了Swift下的swift/base和swift/disruptor两个目录下,现在想要把这两个目录中的内容在写代码时能够自动提示则需要相应的配置修改。Project -> Edit Project,在所打开的配置文件中我更改如下:
{
"folders":
[
{
"follow_symlinks": true,
"path": "/media/WinE/WorkStation/Swift"
}
],
"settings":
{
"sublimeclang_options":
[
"-I/media/WinE/WorkStation/Swift",
"-I/media/WinE/WorkStation/Swift/swift/base",
"-I/media/WinE/WorkStation/Swift/swift/disruptor",
]
}
}
综合以上,如果你有什么问题,请能提出,大家一起进步,希望你能爱上个家伙。
‘叁’ Disruptor 源码分析 一个消费者和多个消费者的区别
它可以用来替代队列,同时有很多SEDA和Actors模式的特性。和队列比较:Disruptor可以向其他线程发送消息,并在需要的时候唤醒其他线程(和BlockingQueue相似)。不过,他们之间有三个主要的区别。2. 把消息放入Disruptor需要2个步骤
‘肆’ 为什么我不再用 NET 框架
.NET平台很棒。真的很棒。直到它不再那么棒。我为什么不再用.NET?简单来说,它限制了我们选择的能力(对我来说很重要),转移了我们的注意力,使得我们向内认知它的安全性,替代了帮助我们认知外面广阔世界的所有可能性。
[系好安全带:这个文章的长度几乎成了一本书…]
优点
首先让我开始说说.NET做得对的许多事吧,尽管这其中的大多数并不来自.NET本身,但却是由.NET社区而来。
C#
C#令人惊叹。我认为它是一个令人惊叹的编程语言。从强大的C语言背景而来,我彻底地喜欢其语法,流和这门语言的所带来的感觉。当然有我可能改变的事,但总体来说它是一门扎实的语言。并且基于开发人员使用的编程语言如此巨额的百分比和Windows操作系统的优越性,它是一门众所周知的语言。
ReSharper
我也很喜欢Resharper。在JetBrains工作的开发者们都是奇迹般的人。如果没有ReSharper和一些相关的工具,我可能并不会如此喜欢C#。
BDD and MSpec
我也很喜欢简称为机器规格(mspec)的BDD风格的框架。它是一个令人惊叹的测试框架,真正支持在测试中使用正确的语言测试本身。在使用mspec之前,我的测试真是一团糟并且很碍我的事。
另外,当我们创建GoConvey—基于Golang的BDD测试框架的时候,Mspec对于我的组织来说是一个巨大的灵感和激励。
多语言运行时
我认为多语言的CLR(公共语言运行时)的观念真得使得JVM的世界思考着。我不知道任何非Java的JVM语言在CLR之前,但随着“公共语言运行时”的到来,我的理解是这使得使用JVM的人们向前进并且最终创造了如Scala和Clojure这样伟大的JVM编程语言。如果我错了请纠正我。再者,CLR使得Sun公司的人们坐下来并关注它,因为Java有一点陈旧并且随着Java 8的到来,仅仅现在才在多个方面追赶着。竞争是一件非常好的事。
NuGet
另一个显着的例子是NuGet。这个包在Windows中作为一个整体特别是在Windows的开发中,它的管理轶事是糟透的。NuGet解决了很多问题,他们也通过从Python和Ruby借用了很多东西去做了很多正确的事。有改进的余地吗?当然。但比起其他一些选择在这儿或那儿的包升级来说,我还没有感到使用NuGet有这许多痛楚。
Mono
对于Mono的开发者们,我不能不说太棒了。他们所创造的太惊奇了。没有任何官方支持和不顾潜在的悬在他们头上的法律问题,他们向前推进并创造了一个居然能替代官方运行时的实现。我已经有一些运行在产品中应用程序,在Mono下运行了几乎一年而没有任何问题。它的产品准备好了吗?这可能取决于你的应用程序(见下文“Mono”)。
CQRS 和事件溯源
可以认为,关于.NET最好事之一是,它是CQRS的诞生地并有相关的技术:事件溯源。就算这样,CQRS+ES本身并没有什么很新的东西。正如Greg Young将会告诉你的,这是由一堆40年历史原料为我们重新打包并更名的。对于大型代码库我有些非常严重的问题,当我5年前使用CQRS+ES的时候,它完全释放了我的域。CQRS+ES现在是命名模式的并且其成长是显而易见的。这可能是因为.NET已经能够和其他的开发平台交互共享的原因。除了这个之外,大多数的创新是从外部来的。
缺点
优点先放在一边,让我们看看什么出错了和我为什么不再用.NET框架。关于我最近开发平台的迁移,最能激励我的事是我可以利用许多最好的部分而丢下不好的部分(如下文所说)。
Windows
正如前文所述,当面对基于网络的服务器软件时,Windows并不是一个好的选手。在我看来,Windows的另一个真正的大问题是传统的Windows开发者是通常仅仅擅长于Windows,当他们离开安乐窝之后就会很快迷失,这对于Linux开发者来说却不是问题。计算远不止是Windows。开发者仅仅能操作单一的操作系统的一个问题是它不可避免得导致Windows的激增。换句话说,Windows生了Windows。没办法打破这个循环。
另一方面,*NIX的开发者通常熟悉多操作系统(Linux,Unix,OSX,Windows等等),一个操作系统的内部工作原理,不同的分布(基于Debian和基于Fedora),窗口管理器,桌面管理器,文件系统,包管理,编译,重新编译,重新打包,命令行“fu”等等。
我的一个心病是文件系统。NTFS并不是系统唯一的文件系统,对于任何给予的任务它几乎都不是最好的选择。ZFS,BTRFS,ReiserFs,ext*等等,有一些很酷的特性。我也很喜欢为了各种高速/透明的磁盘操作,能从BASH创建回路设备或者创建RAM设备。这在Windows中不会发生—如果没有第三方软件的话。
在AWS云服务中,启动一个Windows机器要花掉足足10多分钟。我大约15-20秒就能启动一个简单的Linux机器。当涉及到云计算规模,它能够迅速扩展是很重要的,因为当扩展很重要时,10-15分钟就像是永恒的。
Visual Studio
在我这另一根刺,当属Visual Studio。我需要一个大大超出预期的 IDE 去做任何开发,这个想法困扰着我。它只是如Windows一样庞大的资源猪。我有一个内核i7 3770K 3.5GHZ的台式机,以16GB的内存和最大4512GB的固态硬盘去编译。它差不多刷爆了Windows体验指数,但Windows+VS仍然很慢。(是的,ReSharper使得它更慢了,但是ReSharper对这来说是值得的。)
现在我在MacBook Pro上开发,它比起我的强大的台式机来说只有更少的CPU马力,但运行明显更快,在一个短小的学习曲线之后,UX(用户体验)变得无限美好了。事实上,我甚至不再用鼠标了—我的双手一直在键盘或触控板上,我可以用手势操作我的电脑并让它回应—不像在Windows。
关于VS很酷的一个事是调试器。它的查看和使用,令人难以置信得方便。每隔一段时间会在监视窗口报告错误的值,导致花费更多时间去调试。同时,这也是很大的负面,因为CLR默认的,多线程的世界使得我一开始就需要一个调试器。没有调试器是一个解脱的体验,因为它迫使你以另一种方式编程。
VS同样也有创建“csproj”和“sln”文件的坏毛病。我恨这些。当然,C#必须知道编译什么和何时编译。我理解这点。在Golang中,引用在代码中使用了很重要的语句。如果它不是.NET中用到的工程文件,我可能使用简单的文本编辑器编码C#,并且对这门语言更流畅。使用git rebase操作时,这些文件也有导致合并冲突。
别让我开始说换行符的差异。我不能相信直到今天我们还在处理这样的事。如果VS解决方案文件以Linux行结束符结束,通过双击它并不能载入该解决方案,因为VS解决方案文件分析器读不出它来。
源代码管理
幸运的是,我早就跳出了微软阵营的源代码管理(版本控制系统VSS)。我早在2000年初,在VSS无数次丢失了我的提交之后,就使用了Subversion(译者注:Subversion是开源的版本控制系统)。之后git(译者注:git是开源的版本控制系统,内容管理系统等)出现了,我又迷上了它。不幸的是,没有Windows的接口—对我来说是典型的遭遇。最终有人创建了一个接口,我就用了那个并且没有回头。Git是一把非常锋利的刀,但当你正确运用它的时候,它是一个强大而高效的工具。我曾经在一个小工程中用过TFS(译者注:Team Foundation Server,工作流协作引擎),它是一个怪物—和所有来自Redmond(译者注:美国微软总部)的产品一样。它感染了我的项目文件并且污染了我的源代码目录。真可恶。不,还是谢谢你。给了我任意一天用命令行git…或者可能是SourceTree,如果你需要从GUI得到一点关爱。
Mono
是的,这是第二次提及Mono。正如Mono本身如此惊艳一样。在.NET的世界,它仍然二等公民。无论什么时候我尝试在Mono上运行任何重要的东西,我通常都在和漏洞作斗争。幸运的是,对下载代码,查找问题,发送请求和在Linux上编译代码我没有感到不舒服。但是这件事我都记不清做了多少遍了。
是的,CLR是个巨大的怪物,并且对一个非官方的应用在不同的操作系统都有相同的行为,简直是个类似于分开红海的奇迹。但事实是,我不得不花费如此多的时间来填补漏洞以使我的代码能够正确运行,实在是很难为其辩护。
Mono的特定区域也慢。也许它不是在慢在过载,但对我来说Web服务器是关键所在。并且它非常慢,最后,慢到了最底下—即使是微不足道的东西。我想好消息是它只能从这儿得到更好的。我也应该提及Mono的开发者可能忘了Linux,比起我可能知道的还多,所以我不能太挑剔。
IIS
也许IIS在尝试着为太多的应用程序做太多的事情。它从作为一个web服务器变为像J2EE应用程序容器一样的应用程序宿主。它也站在慢速这一边。我猜如果我需要更高的性能,我应该编写我自己的web服务器,但我真的很想只关注我应用程序的代码。可能利用Windows事件服务器将是好的,但nginx(译者注:一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器)和其他服务器只是不喜欢在Windows中生产。
虚拟的以JVM为基础的实现,例如Netty(译者注:JBOSS提供的一个java开源框架),很容易处理每秒650K+/的请求量。IIS在运行一个简单的CLR应用程序“Hello,World!”,处理大约每秒50K的请求量时就会壅塞。(有趣的题外话,参考基准开发者通过TCP套接字创建了一个简单的C#的web服务器,它能处理大约每秒120K的请求量。)
狭隘的心理
前些年有个运动叫做ALT.NET。该运动是全部是关于寻找我们自身之外的更广阔的开发社区以作为一个整体,并汇聚不同的部分。有趣的是,那是StructureMap、Autofac、NuGet、ASP.NET MVC和许多其它工具的灵感来源。在传统的.NET的圈子里,这个运动受到了很多的不屑和鄙视。我把这看作是,作为一个整体的社区普遍的狭隘心理和怠惰的一个极大的例证。(的确,它们中的一些可能会消失,进而以包括Redis,MongoBD还有其它的不同的技术而出现。)
有这么多很棒的方案在那里。假定微软已注定是唯一正确之路的想法是荒谬的。如果是这样的话,我们就都还在使用Visual Studio的设计工具去拖放按钮和链接元素到一个WebForm的界面上,我们会设定了该按钮并且依赖ViewState以帮助我们与可怕的HTTP所带来的恐惧隔开。我从我的一个部署的代码库中最后一个WebForm中摆脱的那一天,是个光荣的值得庆贺的日子。
谁又曾想过“网络控制”是个好主意?很显然我考虑过因为我喝了Kool-Aid(译者注:卡夫公司出品的饮料,这里意指明知是注定的或有危险的仍然去做,有负面涵义)并且完全接受它。它狠咬了我。见过2MB的ViewState吗?
[注:当我写这篇文章的时候,原来的标题,“为什么我不再用.NET”,意味着整个.NET生态系统。标题感觉有点短于是我更新为“为什么我不再用.NET框架”。我想.NET作为一个生态系统,包括了所有的工具,工程,平台,组织还有很多开发者。这就是为什么有些更广泛的.NET社区的元素在我的这篇文章中受到抨击原因。]
性能杀手
C,Java和C#中典型的多线程范例都强烈推荐使用锁和互斥。对于锁来说有个隐藏的开销:它们慢得难以忍受。使用Disruptor(JVM中的无锁的环形缓存[译者注:实际上就是拥有一个序号指向下一个可用元素的数组]),你可以很容易得每秒处理20M以上的事件。在.NET中使用规定的“最佳实践”等任何超过每秒十几次的传输,都被认为是体面又好的性能表现,在这一点上来说你仅仅需要更大/更好/更多的硬件设备。事实上,我见过第三方客户端库(Rabbit,Couch,Mongo等等)中锁语句遍布整个代码。即使在我的代码中没有任何的并发,默认的和首选的方法都用了锁。
无锁的、事件驱动的方法允许你大幅降低硬件和资金支出。大部分应用程序可以轻易地运行在两台机器上,第二台机器仅仅在冗余和失效备援时是必须的,以防因为硬件相关的问题导致第一台机器不可用的时候起作用。
这个问题的另一个方面是调用网络和磁盘子系统的传统方式:同步,阻塞代码。如果你需要多个并发的HTTP请求,你需要更多的线程。大多数人不知道的是,为维持线程多出的1-2MB和上下文切换线程的需求,使得CPU内核消耗所有的时间颠簸在上下文切换上而不是做真正的工作。所以现在我们得到了在一个应用程序中数百或数千的线程,占用了RAM,并造成CPU停滞不前。还有个更好的方式。
Netty/NIO (JVM),Erlang,Node,Gevent (Python)和Go都支持使用事件驱动的子系统操作(选择/epoll[译者注:Linux内核中的一种可扩展IO事件处理机制]/kqueue[译者注:FreeBSD的可扩展的事件通知接口])。这就意味着当等待数据包被tx/rx跨网络的时候,CPU可以自由地去做其它,重要的工作。因为JVM的成熟,Netty可以认为是做这项工作最快的,但我喜欢Go用Goroutines操作这个的方式—它简单,优雅,很容易推理,没有像意大利面条一样的回调。
SQL Server
作为一名.NET开发者,当你开始一个新的工程时,有一些事是你通常会去做的:
创建一个新的solution
将其部署到Team Foundation Server(译者注:Microsoft 应用程序生命周期管理 (ALM) 解决方案的核心协作平台)
IIS中建立相应的网站入口
创建一个新的SQL Server数据库
在solution中关联Entity Framework(通常是2010年之后创建的工程)
开始设计你的数据库和ActiveRecord实体
在大多数情况下这不是编写代码的正确方式。当然它可能在某些情况下有效,但是作为一个“默认的架构”它并不是你想要的。为什么在我们甚至还没理解问题领域之前已经做了任何技术上的选择?这简直是本末倒置了。
微软的生态系统鼓励每个人使用SQL Server。在Visual Studio中和SQL Service进行交互或者使用SQL Management Studio(和它的前身,SQL查询分析器)是如此令人难以置信的容易。这种以数据库为中心的重点,是钦定的或唯一正确的方式的一部分。它使你更加迷恋微软。厂商锁定始终对厂商来说是好的。
为什么我们要如此开发?为什么我们不更多地考虑应用程序的行为而不是它如何存储的?现在我所有的项目都使用基于JSON的键/值存储。有了这种功能,我可以选择任何我想要的存储引擎,包括SQL Server,Oracle,PostgreSQL,MySQL,Cassandra, CouchDB, CouchBase, Dynamo, SimpleDB, S3, Riak, BerkeleyDB, Firebird, Hypertable, RavenDB, Redis, Tokyo Cabinet/Tyrant, Azure Blobs,文件系统中的明文JSON文件等等等等。突然之间,我们能够开始根据其优点而不是仅仅对其熟悉来选择存储引擎了。
题外话:在AWS RDS的云上运行过SQL Server吗?别这么做。当然它会工作,但是一些例如复制这样最简单的事是不存在的。文章充斥着对SQL Server不能在AWS RDS上工作的引用。
结论
也许我在软件开发中学到的两件最重要的教训是:
边界和封装的重要性(以多种形式)
付出代价以得到正确的模型和抽象
许多年前我恨“模型”这个词。每个人都会把它到处扔,它是一个如此过载的术语,很难理解它的含义和它为什么这么重要。就这点来说,我仅仅会说模型是对你想要封装的现实的一个有限的表示。也许最简单的例子就是地球仪的墨卡托投影了。这很确切得说明了一件事:导航。如果你在其他的事情上使用它,它并不毫无价值。如果你不专注于付出代价去使模型正确,去封装商业现实,那么没有任何技术能够拯救你。
我对.NET最大的抱怨是,“唯一正确的方式”引导你远离理想的模型并把你推向关注实现细节和技术缺陷的方向。这样的关注导致技术实施渗血并且感染模型,最终导致它腐烂变质,因为它不能适应不断变化的商业需求。当这发生的时候,开发者挣扎着并蹬踢着,如同吸毒者一样,他们从一个新技术转向另一个,以期望下一个强大的技术能够治愈他们的病痛。
技术本身并不是灵丹妙药,相反地,它是关于取舍和选择。只有正确地理解了商业行为并把它们封装进结构良好的,易于理解的模型中,以帮助保持技术堆栈在属于它的地方—作为一个实现细节。
这就是我为什么不再用.NET 框架,因为它不断地重申自己(的主张),不断地想要比它的本身更多的:一个实现细节。
‘伍’ GitHub上面有哪些经典的java框架源码
Bazel:来自Google的构建工具,可以快速、可靠地构建代码。官网
Gradle:使用Groovy(非XML)进行增量构建,可以很好地与Maven依赖管理配合工作。官网
Buck:Facebook构建工具。官网
ASM:通用底层字节码操作和分析开发库。官网
Byte Buddy:使用流式API进一步简化字节码生成。官网
Byteman:在运行时通过DSL(规则)操作字节码进行测试和故障排除。官网
Javassist:一个简化字节码编辑尝试。官网
Apache Aurora:Apache Aurora是一个Mesos框架,用于长时间运行服务和定时任务(cron job)。官网
Singularity:Singularity是一个Mesos框架,方便部署和操作。它支持Web Service、后台运行、调度作业和一次性任务。官网
Checkstyle:代码编写规范和标准静态分析工具。官网
Error Prone:将常见编程错误作为运行时错误报告。官网
FindBugs:通过字节码静态分析查找隐藏bug。官网
jQAssistant:使用基于Neo4J查询语言进行代码静态分析。官网
PMD:对源代码分析查找不良的编程习惯。官网
SonarQube:通过插件集成其它分析组件,对过去一段时间内的数据进行统计。官网
ANTLR:复杂的全功能自顶向下解析框架。官网
JavaCC:JavaCC是更加专门的轻量级工具,易于上手且支持语法超前预测。官网
config:针对JVM语言的配置库。官网
owner:减少冗余配置属性。官网
Choco:可直接使用的约束满足问题求解程序,使用了约束规划技术。官网
JaCoP:为FlatZinc语言提供了一个接口,可以执行MiniZinc模型。官网
OptaPlanner:企业规划与资源调度优化求解程序。官网
Sat4J:逻辑代数与优化问题最先进的求解程序。官网
Bamboo:Atlassian解决方案,可以很好地集成Atlassian的其他产品。可以选择开源许可,也可以购买商业版。官网
CircleCI:提供托管服务,可以免费试用。官网
Codeship:提供托管服务,提供有限的免费模式。官网
fabric8:容器集成平台。官网
Go:ThoughtWork开源解决方案。官网
Jenkins:支持基于服务器的部署服务。官网
TeamCity:JetBrain的持续集成解决方案,有免费版。官网
Travis:通常用作开源项目的托管服务。官网
Buildkite: 持续集成工具,用简单的脚本就能设置pipeline,而且能快速构建,可以免费试用。官网
uniVocity-parsers:速度最快功能最全的CSV开发库之一,同时支持TSV与固定宽度记录的读写。官网
Apache Phoenix:HBase针对低延时应用程序的高性能关系数据库层。官网
Crate:实现了数据同步、分片、缩放、复制的分布式数据存储。除此之外还可以使用基于SQL的语法跨集群查询。官网
Flyway:简单的数据库迁移工具。官网
H2:小型SQL数据库,以可以作为内存数据库使用着称。官网
HikariCP:高性能JDBC连接工具。官网
JDBI:便捷的JDBC抽象。官网
Protobuf:Google数据交换格式。官网
SBE:简单二进制编码,是最快速的消息格式之一。官网
Wire:整洁轻量级协议缓存。官网
Apache DeltaSpike:CDI扩展框架。官网
Dagger2:编译时注入框架,不需要使用反射。官网
Guice:可以匹敌Dagger的轻量级注入框架。官网
HK2:轻量级动态依赖注入框架。官网
ADT4J:针对代数数据类型的JSR-269代码生成器。官网
AspectJ:面向切面编程(AOP)的无缝扩展。官网
Auto:源代码生成器集合。官网
DCEVM:通过修改JVM在运行时支持对已加载的类进行无限次重定义。官网
HotswapAgent:支持无限次重定义运行时类与资源。官网
Immutables:类似Scala的条件类。官网
JHipster:基于Spring Boot与AngularJS应用程序的Yeoman源代码生成器。官网
JRebel:无需重新部署,可以即时重新加载代码与配置的商业软件。官网
Lombok:减少冗余的代码生成器。官网
Spring Loaded:类重载代理。官网
vert.x:多语言事件驱动应用框架。官网
Akka:用来编写分布式容错并发事件驱动应用程序的工具和运行时。官网
Apache Storm:实时计算系统。官网
Apache ZooKeeper:针对大型分布式系统的协调服务,支持分布式配置、同步和名称注册。官网
Hazelcast:高可扩展内存数据网格。官网
Hystrix:提供延迟和容错。官网
JGroups:提供可靠的消息传递和集群创建的工具。官网
Orbit:支持虚拟角色(Actor),在传统角色的基础上增加了另外一层抽象。官网
Quasar:为JVM提供轻量级线程和角色。官网
Apache Cassandra:列式数据库,可用性高且没有单点故障。官网
Apache HBase:针对大数据的Hadoop数据库。官网
Druid:实时和历史OLAP数据存储,在聚集查询和近似查询方面表现不俗。官网
Infinispan:针对缓存的高并发键值对数据存储。官网
Bintray:发布二进制文件版本控制工具。可以于Maven或Gradle一起配合使用。提供开源免费版本和几种商业收费版本。官网
Central Repository:最大的二进制组件仓库,面向开源社区提供免费服务。Apache Maven默认使用Central官网Repository,也可以在所有其他构建工具中使用。
IzPack:为跨平台部署建立创作工具(Authoring Tool)。官网
JitPack:打包GitHub仓库的便捷工具。可根据需要构建Maven、Gradle项目,发布可立即使用的组件。官网
Launch4j:将JAR包装为轻量级本机Windows可执行程序。官网
Nexus:支持代理和缓存功能的二进制管理工具。官网
packr:将JAR、资源和JVM打包成Windows、Linux和Mac OS X本地发布文件。官网
Apache POI:支持OOXML规范(XLSX、DOCX、PPTX)以及OLE2规范(XLS、DOC、PPT)。官网
documents4j:使用第三方转换器进行文档格式转换,转成类似MS Word这样的格式。官网
jOpenDocument:处理OpenDocument格式(由Sun公司提出基于XML的文档格式)。官网
Cyclops:支持一元(Monad)操作和流操作工具类、comprehension(List语法)、模式匹配、trampoline等特性。官网
Fugue:Guava的函数式编程扩展。官网
Functional Java:实现了多种基础和高级编程抽象,用来辅助面向组合开发(composition-oriented development)。官网
Javaslang:一个函数式组件库,提供持久化数据类型和函数式控制结构。官网
jOOλ:旨在填补Java 8 lambda差距的扩展,提供了众多缺失的类型和一组丰富的顺序流API。官网
jMonkeyEngine:现代3D游戏开发引擎。官网
libGDX:全面的跨平台高级框架。官网
LWJGL:对OpenGL/CL/AL等技术进行抽象的健壮框架。官网
JavaFX:Swing的后继者。官网
Scene Builder:开发JavaFX应用的可视化布局工具。官网
Agrona:高性能应用中常见的数据结构和工具方法。官网
Disruptor:线程间消息传递开发库。官网
fastutil:快速紧凑的特定类型集合(Collection)。官网
GS Collections:受Smalltalk启发的集合框架。官网
HPPC:基础类型集合。官网
Javolution:实时和嵌入式系统的开发库。官网
JCTools:JDK中缺失的并发工具。官网
Koloboke:Hash set和hash map。官网
Trove:基础类型集合。官网
High-scale-bli:Cliff Click 个人开发的高性能并发库官网
Eclipse:老牌开源项目,支持多种插件和编程语言。官网
IntelliJ IDEA:支持众多JVM语言,是安卓开发者好的选择。商业版主要针对企业客户。官网
NetBeans:为多种技术提供集成化支持,包括Java SE、Java EE、数据库访问、HTML5
Imgscalr:纯Java 2D实现,简单、高效、支持硬件加速的图像缩放开发库。官网
Picasso:安卓图片下载和图片缓存开发库。官网
Thumbnailator:Thumbnailator是一个高质量Java缩略图开发库。官网
ZXing:支持多种格式的一维、二维条形码图片处理开发库。官网
im4java: 基于ImageMagick或GraphicsMagick命令行的图片处理开发库,基本上ImageMagick能够支持的图片格式和处理方式都能够处理。官网
Apache Batik:在Java应用中程序以SVG格式显示、生成及处理图像的工具集,包括SVG解析器、SVG生成器、SVG DOM等模块,可以集成使用也可以单独使用,还可以扩展自定义的SVG标签。官网
Genson:强大且易于使用的Java到JSON转换开发库。官网
Gson:谷歌官方推出的JSON处理库,支持在对象与JSON之间双向序列化,性能良好且可以实时调用。官网
Jackson:与GSON类似,在频繁使用时性能更佳。官网
LoganSquare:基于Jackson流式API,提供对JSON解析和序列化。比GSON与Jackson组合方式效果更好。官网
Fastjson:一个Java语言编写的高性能功能完善的JSON库。官网
Kyro:快速、高效、自动化的Java对象序列化和克隆库。官网
JDK 9:JDK 9的早期访问版本。官网
OpenJDK:JDK开源实现。官网
Scala:融合了面向对象和函数式编程思想的静态类型编程语言。官网
Groovy:类型可选(Optionally typed)的动态语言,支持静态类型和静态编译。目前是一个Apache孵化器项目。官网
Clojure:可看做现代版Lisp的动态类型语言。官网
Ceylon:RedHat开发的面向对象静态类型编程语言。官网
Kotlin:JetBrain针对JVM、安卓和浏览器提供的静态类型编程语言。官网
Xtend:一种静态编程语言,能够将其代码转换为简洁高效的Java代码,并基于JVM运行。官网
Apache Log4j 2:使用强大的插件和配置架构进行完全重写。官网
kibana:分析及可视化日志文件。官网
Logback:强健的日期开发库,通过Groovy提供很多有趣的选项。官网
logstash:日志文件管理工具。官网
Metrics:通过JMX或HTTP发布参数,并且支持存储到数据库。官网
SLF4J:日志抽象层,需要与具体的实现配合使用。官网
Apache Flink:快速、可靠的大规模数据处理引擎。官网
Apache Hadoop:在商用硬件集群上用来进行大规模数据存储的开源软件框架。官网
Apache Mahout:专注协同过滤、聚类和分类的可扩展算法。官网
Apache Spark:开源数据分析集群计算框架。官网
DeepDive:从非结构化数据建立结构化信息并集成到已有数据库的工具。官网
Deeplearning4j:分布式多线程深度学习开发库。官网
H2O:用作大数据统计的分析引擎。官网
Weka:用作数据挖掘的算法集合,包括从预处理到可视化的各个层次。官网
QuickML:高效机器学习库。官网、GitHub
Aeron:高效可扩展的单播、多播消息传递工具。官网
Apache ActiveMQ:实现JMS的开源消息代理(broker),可将同步通讯转为异步通讯。官网
Apache Camel:通过企业级整合模式(Enterprise Integration Pattern EIP)将不同的消息传输API整合在一起。官网
Apache Kafka:高吞吐量分布式消息系统。官网
Hermes:快速、可靠的消息代理(Broker),基于Kafka构建。官网
JBoss HornetQ:清晰、准确、模块化,可以方便嵌入的消息工具。官网
JeroMQ:ZeroMQ的纯Java实现。官网
Smack:跨平台XMPP客户端函数库。官网
Openfire:是开源的、基于XMPP、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并可利用Web界面进行管理。官网GitHub
Spark:是一个开源,跨平台IM客户端。它的特性支持集组聊天,电话集成和强大安全性能。如果企业内部部署IM使用Openfire+Spark是最佳的组合。官网GitHub
Tigase: 是一个轻量级的可伸缩的 Jabber/XMPP 服务器。无需其他第三方库支持,可以处理非常高的复杂和大量的用户数,可以根据需要进行水平扩展。官网
Design Patterns:实现并解释了最常见的设计模式。官网
Jimfs:内存文件系统。官网
Lanterna:类似curses的简单console文本GUI函数库。官网
LightAdmin:可插入式CRUD UI函数库,可用来快速应用开发。官网
OpenRefine:用来处理混乱数据的工具,包括清理、转换、使用Web Service进行扩展并将其关联到数据库。官网
RoboVM:Java编写原生iOS应用。官网
Quartz:强大的任务调度库.官网
AppDynamics:性能监测商业工具。官网
JavaMelody:性能监测和分析工具。官网
Kamon:Kamon用来监测在JVM上运行的应用程序。官网
New Relic:性能监测商业工具。官网
SPM:支持对JVM应用程序进行分布式事务追踪的性能监测商业工具。官网
Takipi:产品运行时错误监测及调试商业工具。官网
JNA:不使用JNI就可以使用原生开发库。此外,还为常见系统函数提供了接口。官网
Apache OpenNLP:处理类似分词等常见任务的工具。官网
CoreNLP:斯坦佛CoreNLP提供了一组基础工具,可以处理类似标签、实体名识别和情感分析这样的任务。官网
LingPipe:一组可以处理各种任务的工具集,支持POS标签、情感分析等。官网
Mallet:统计学自然语言处理、文档分类、聚类、主题建模等。官网
Async Http Client:异步HTTP和WebSocket客户端函数库。官网
Grizzly:NIO框架,在Glassfish中作为网络层使用。官网
Netty:构建高性能网络应用程序开发框架。官网
OkHttp:一个Android和Java应用的HTTP+SPDY客户端。官网
Undertow:基于NIO实现了阻塞和非阻塞API的Web服务器,在WildFly中作为网络层使用。官网
Ebean:支持快速数据访问和编码的ORM框架。官网
EclipseLink:支持许多持久化标准,JPA、JAXB、JCA和SDO。官网
Hibernate:广泛使用、强健的持久化框架。Hibernate的技术社区非常活跃。官网
MyBatis:带有存储过程或者SQL语句的耦合对象(Couples object)。官网
OrmLite:轻量级开发包,免除了其它ORM产品中的复杂性和开销。官网
Nutz:另一个SSH。官网,Github
JFinal:JAVA WEB + ORM框架。官网,Github
Apache FOP:从XSL-FO创建PDF。官网
Apache PDFBox:用来创建和操作PDF的工具集。官网
DynamicReports:JasperReports的精简版。官网
flyingsaucer:XML/XHTML和CSS 2.1渲染器。官网
iText:一个易于使用的PDF函数库,用来编程创建PDF文件。注意,用于商业用途时需要许可证。官网
JasperReports:一个复杂的报表引擎。官网
jHiccup:提供平台中JVM暂停的日志和记录。官网
JMH:JVM基准测试工具。官网
JProfiler:商业分析器。官网
LatencyUtils:测量和报告延迟的工具。官网
VisualVM:对运行中的应用程序信息提供了可视化界面。官网
YourKit Java Profiler:商业分析器。官网
Reactive Streams:异步流处理标准,支持非阻塞式反向压力(backpressure)。官网
Reactor:构建响应式快速数据(fast-data)应用程序的开发库。官网
RxJava:通过JVM可观察序列(observable sequence)构建异步和基于事件的程序。官网
Dropwizard:偏向于自己使用的Web框架。用来构建Web应用程序,使用了Jetty、Jackson、Jersey和Metrics。官网
Feign:受Retrofit、JAXRS-2.0和WebSocket启发的HTTP客户端连接器(binder)。官网
Jersey:JAX-RS参考实现。官网
RESTEasy:经过JAX-RS规范完全认证的可移植实现。官网
RestExpress:一个Java类型安全的REST客户端。官网
RestX:基于注解处理和编译时源码生成的框架。官网
Retrofit:类型安全的REST客户端。官网
Spark:受到Sinatra启发的Java REST框架。官网
Swagger:Swagger是一个规范且完整的框架,提供描述、生产、消费和可视化RESTful Web Service。官网
Blade:国人开发的一个轻量级的MVC框架. 它拥有简洁的代码,优雅的设计。官网
DataMelt:用于科学计算、数据分析及数据可视化的开发环境。官网
JGraphT:支持数学图论对象和算法的图形库。官网
JScience:用来进行科学测量和单位的一组类。官网
Apache Solr:一个完全的企业搜索引擎。为高吞吐量通信进行了优化。官网
Elasticsearch:一个分布式、支持多租户(multitenant)全文本搜索引擎。提供了RESTful Web接口和无schema的JSON文档。官网
Apache Lucene:是一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。官网
Apache Shiro:执行认证、授权、加密和会话管理。官网
Bouncy Castle,涵盖了从基础的帮助函数到PGP/SMIME操作。官网:多途加密开发库。支持JCA提供者(JCA provider)
Cryptomator:在云上进行客户端跨平台透明加密。官网
Keycloak:为浏览器应用和RESTful Web Service集成SSO和IDM。目前还处于beta版本,但是看起来非常有前途。官网
PicketLink:PicketLink是一个针对Java应用进行安全和身份认证管理的大型项目(Umbrella Project)。官网
FlatBuffers:高效利用内存的序列化函数库,无需解包和解析即可高效访问序列化数据。官网
Kryo:快速、高效的对象图形序列化框架。官网
FST:提供兼容JDK的高性能对象图形序列化。官网
MessagePack:一种高效的二进制序列化格式。官网
Apache Tomcat:针对Servlet和JSP的应用服务器,健壮性好且适用性强。官网
Apache TomEE:Tomcat加Java EE。官网
Jetty:轻量级、小巧的应用服务器,通常会嵌入到项目中。官网
WebSphere Liberty:轻量级、模块化应用服务器,由IBM开发。官网
WildFly:之前被称作JBoss,由Red Hat开发。支持很多Java EE功能。官网
Apache Velocity:提供HTML页面模板、email模板和通用开源代码生成器模板。官网
FreeMarker:通用模板引擎,不需要任何重量级或自己使用的依赖关系。官网
Handlebars.java:使用Java编写的模板引擎,逻辑简单,支持语义扩展(semantic Mustache)。官网
Thymeleaf:旨在替换JSP,支持XML文件的工具。官网
Apache JMeter:功能性测试和性能评测。官网
Arquillian:集成测试和功能行测试平台,集成Java EE容器。官网
AssertJ:支持流式断言提高测试的可读性。官网
Awaitility:用来同步异步操作的DSL。官网
Cucumber:BDD测试框架。官网
Gatling:设计为易于使用、可维护的和高性能负载测试工具。官网
Hamcrest:可用来灵活创建意图(intent)表达式的匹配器。官网
JMockit:用来模拟静态、final方法等。官网
JUnit:通用测试框架。官网
Mockito:在自动化单元测试中创建测试对象,为TDD或BDD提供支持。官网
PowerMock: 支持模拟静态方法、构造函数、final类和方法、私有方法以及移除静态初始化器的模拟工具。官网
REST Assured:为REST/HTTP服务提供方便测试的Java DSL。官网
Selenide:为Selenium提供精准的周边API,用来编写稳定且可读的UI测试。官网
Selenium:为Web应用程序提供可移植软件测试框架。官网
Spock:JUnit-compatible framework featuring an expressive Groovy-derived specification language.官网兼容JUnit框架,支持衍生的Groovy范的语言。
TestNG:测试框架。官网
Truth:Google的断言和命题(proposition)框架。官网
Unitils:模块化测试函数库,支持单元测试和集成测试。官网
WireMock:Web Service测试桩(Stub)和模拟函数。官网
Apache Commons:提供各种用途的函数,比如配置、验证、集合、文件上传或XML处理等。官网
args4j:命令行参数解析器。官网
CRaSH:为运行进行提供CLI。官网
Gephi:可视化跨平台网络图形化操作程序。官网
Guava:集合、缓存、支持基本类型、并发函数库、通用注解、字符串处理、I/O等。官网
JADE:构建、调试多租户系统的框架和环境。官网
javatuples:正如名字表示的那样,提供tuple支持。尽管目前tuple的概念还有留有争议。官网
JCommander:命令行参数解析器。官网
Protégé:提供存在论(ontology)编辑器以及构建知识系统的框架。官网
Apache Nutch:可用于生产环境的高度可扩展、可伸缩的网络爬虫。官网
Crawler4j:简单的轻量级网络爬虫。官网
JSoup:刮取、解析、操作和清理HTML。官网
Apache Tapestry:基于组件的框架,使用Java创建动态、强健的、高度可扩展的Web应用程序。官网
Apache Wicket:基于组件的Web应用框架,与Tapestry类似带有状态显示GUI。官网
Google Web Toolkit:一组Web开发工具集,包含在客户端将Java代码转为JavaScript的编译器、XML解析器、RCP官网API、JUnit集成、国际化支持和GUI控件。
Grails:Groovy框架,旨在提供一个高效开发环境,使用约定而非配置、没有XML并支持混入(mixin)。官网
Ninja:Java全栈Web开发框架。非常稳固、快速和高效。官网
Pippo:小型、高度模块化的类Sinatra框架。官网
Play:使用约定而非配置,支持代码热加载并在浏览器中显示错误。官网
PrimeFaces:JSF框架,提供免费和带支持的商业版本。包括若干前端组件。官网
Ratpack:一组Java开发函数库,用于构建快速、高效、可扩展且测试完备的HTTP应用程序。官网
Spring Boot:微框架,简化了Spring新程序的开发过程。官网
Spring:旨在简化Java EE的开发过程,提供依赖注入相关组件并支持面向切面编程。官网
Vaadin:基于GWT构建的事件驱动框架。使用服务端架构,客户端使用Ajax。官网
Blade:国人开发的一个轻量级的MVC框架. 它拥有简洁的代码,优雅的设计。官网
jBPM:非常灵活的业务流程管理框架,致力于构建开发与业务分析人员之间的桥梁。官网
Activity:轻量级工作流和业务流程管理框架。官网github
字节码操作
编程方式操作字节码的开发库。
集群管理
在集群内动态管理应用程序的框架。
代码分析
测量代码指标和质量工具。
编译器生成工具
用来创建解析器、解释器或编译器的框架。
外部配置工具
支持外部配置的开发库。
约束满足问题求解程序
帮助解决约束满足问题的开发库。
持续集成
CSV解析
简化CSV数据读写的框架与开发库
数据库
简化数据库交互的相关工具。
帮实现依赖翻转范式的开发库。官网
开发流程增强工具
从最基本的层面增强开发流程。
分布式应用
用来编写分布式容错应用的开发库和框架。
分布式数据库
对应用程序而言,在分布式系统中的数据库看起来就像是只有一个数据源。
发布
以本机格式发布应用程序的工具。
文档处理工具
处理Office文档的开发库。
函数式编程
函数式编程支持库。
游戏开发
游戏开发框架。
GUI
现代图形化用户界面开发库。
高性能计算
涵盖了从集合到特定开发库的高性能计算相关工具。
IDE
简化开发的集成开发环境。
JSON
简化JSON处理的开发库。
JVM与JDK
目前的JVM和JDK实现。
基于JVM的语言
除Java外,可以用来编写JVM应用程序的编程语言。
日志
记录应用程序行为日志的开发库。
机器学习
提供具体统计算法的工具。其算法可从数据中学习。
消息传递
在客户端之间进行消息传递,确保协议独立性的工具。
杂项
未分类其它资源。
应用监控工具
监控生产环境中应用程序的工具。
原生开发库
用来进行特定平台开发的原生开发库。
自然语言处理
用来专门处理文本的函数库。
网络
网络编程函数库。
ORM
处理对象持久化的API。
用来帮助创建PDF文件的资源。
性能分析
性能分析、性能剖析及基准测试工具。
响应式开发库
用来开发响应式应用程序的开发库。
REST框架
用来创建RESTful 服务的框架。
科学计算与分析
用于科学计算和分析的函数库。
搜索引擎
文档索引引擎,用于搜索和分析。
安全
用于处理安全、认证、授权或会话管理的函数库。
序列化
用来高效处理序列化的函数库。
应用服务器
用来部署应用程序的服务器。
模板引擎
在模板中替换表达式的工具。
测试
测试内容从对象到接口,涵盖性能测试和基准测试工具。
通用工具库
通用工具类函数库。
网络爬虫
用于分析网站内容的函数库。
Web框架
用于处理Web应用程序不同层次间通讯的框架。
业务流程管理套件
流程驱动的软件系统构建。
资源
社区
‘陆’ ubuntu 怎么打开 sublime text
Sublime Text是个跨平台的编辑器,支持Windows、Linux、Mac系统平台,支持各种语言的代码编辑,配合上对应的插件,话上点时间学习,你将会对它爱不释手,大大的提高你的编码效率。本文将讲解在Ubuntu 14.04系统中安装SublimeText 3,并配置SublimeClang插件来配置C/C++开发环境。
1. Sublime Text 3的下载安装
到官方网站上http://www.sublimetext.com/3下载64位(系统位64位)的.deb安装包(http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb),下载后双击安装即可。安装好之后,通过命令subl即可打开程序,此时已经可以编写代码了。在开始之前建议先记下一些常用的快捷键,可参考:http://blog.csdn.net/cywosp/article/details/31791881
2. 安装Package Control
Package Control是一个用于管理插件的好工具,可以用于安装、删除、禁用相应的插件,常用的插件都能在上面找到。其源码地址在https://github.com/wbond/package_control_channel上,安装非常方便,使用git将该代码先克隆下来即可,然后拷贝到~/.config/sublime-text-3/Packages/目录下并命名为Package Control即可。(也可以直接在github上打包下载,然后解压复制到~/.config/sublime-text-3/Packages/目录下并命名为Package Control)。
cd ~/.config/sublime-text-3/Packages/
git clone https://github.com/wbond/package_control_channel.git Package\ Control
或者打开sublime_text然后按快捷键ctrl+`(Esc下面那个键),在弹出的命令输入窗口输入下面信息回车即可:
import urllib.request,os,hashlib; h = '' + ''; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
重新启动SublimeText 3,然后使用快捷键Ctrl + Shift + p,在弹出的输入框中输入Package Control则可以看到Install Package的选项,选择它后一会儿(看左下角的状态)会弹出插件查询及安装窗口,输入想用的插件,选中回车即可。如果用于C/C++开发建议安装C++ snipptes,ConvertToUTF8,SublimeAStyleFormatter插件,具体代表什么意思一下就清楚了。
3. 安装强大的SublimeClang插件
SublimeClang是Sublime Text中唯一的C/C++自动补全插件,功能强大,自带语法检查功能,不过最近作者已经停止更新了,目前只能在Sublime Text 2的Package Control中可以找到并自动安装,在SublimeText 3中只能手动通过源码安装,其代码线在https://github.com/quarnster/SublimeClang中。具体安装步骤如下:
安装相关软件
sudo apt-get install cmake build-essential clang git
cd ~/.config/sublime-text-3/Packages
git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
cd SublimeClang
cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so #这一步很重要,如果你的clang库不是3.4版本的话,请将对应版本的库拷贝到internals中
cd src
mkdir build
cd build
cmake ..
make
一切成功的话将会在SublimeClang/internals目录中生成libcache.so库文件。重启Sublime Text,然后按快捷键Ctrl + `(Esc下面那个键)打开自带的控制输出,看看有没有错误,如果没有错误就说明一切OK了。接下来就是配置自己的文件了,按下ctrl + shift + p快捷键,在弹出的输入框中输入 sublimeclang settings ,然后选择带User那一行,在打开的文件中输入如下信息:
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"options":
[
"-std=gnu++11",
"-isystem", "/usr/include",
"-isystem", "/usr/include/c++/*",
"-isystem", "/usr/include/c++/4.8",
"-isystem", "/usr/include/c++/4.8/*",
"-isystem", "/usr/include/boost",
"-isystem", "/usr/include/boost/**",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
]
}
注释:我的gcc版本为4.8,如果你的不是请替换对应的版本,在#include相应的头文件后保存当前文件,在接下来的操作中将更快的提示所包含在头文件的函数或者变量。
4. 工程实例
通过菜单栏中的Project -> Add Folder To Project...把你已有的原代码目录加入到Sublime Text中,然后通过Project -> Save Project As...来保存你的项目,这样就创建好了项目。例如我的机器在/media/WinE/WorkStation/Swift中有个C++项目,代码分别放在了Swift下的swift/base和swift/disruptor两个目录下,现在想要把这两个目录中的内容在写代码时能够自动提示则需要相应的配置修改。Project -> Edit Project,在所打开的配置文件中我更改如下:
{
"folders":
[
{
"follow_symlinks": true,
"path": "/media/WinE/WorkStation/Swift"
}
],
"settings":
{
"sublimeclang_options":
[
"-I/media/WinE/WorkStation/Swift",
"-I/media/WinE/WorkStation/Swift/swift/base",
"-I/media/WinE/WorkStation/Swift/swift/disruptor",
]
}
}
综合以上,如果你有什么问题,请能提出,大家一起进步,希望你能爱上个家伙。
‘柒’ linux sublime3 怎么写c
Sublime Text是个跨平台的编辑器,支持Windows、Linux、Mac系统平台,支持各种语言的代码编辑,配合上对应的插件,话上点时间学习,你将会对它爱不释手,大大的提高你的编码效率。本文将讲解在Ubuntu 14.04系统中安装SublimeText 3,并配置SublimeClang插件来配置C/C++开发环境。
1. Sublime Text 3的下载安装
到官方网站上http://www.sublimetext.com/3下载64位(系统位64位)的.deb安装包(http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb),下载后双击安装即可。安装好之后,通过命令subl即可打开程序,此时已经可以编写代码了。在开始之前建议先记下一些常用的快捷键,可参考:http://blog.csdn.net/cywosp/article/details/31791881
2. 安装Package Control
Package Control是一个用于管理插件的好工具,可以用于安装、删除、禁用相应的插件,常用的插件都能在上面找到。其源码地址在https://github.com/wbond/package_control_channel上,安装非常方便,使用git将该代码先克隆下来即可,然后拷贝到~/.config/sublime-text-3/Packages/目录下并命名为Package Control即可。(也可以直接在github上打包下载,然后解压复制到~/.config/sublime-text-3/Packages/目录下并命名为Package Control)。
cd ~/.config/sublime-text-3/Packages/
git clone https://github.com/wbond/package_control_channel.git Package\ Control
重新启动SublimeText 3,然后使用快捷键Ctrl + Shift + p,在弹出的输入框中输入Package Control则可以看到Install Package的选项,选择它后一会儿(看左下角的状态)会弹出插件查询及安装窗口,输入想用的插件,选中回车即可。如果用于C/C++开发建议安装C++ snipptes,ConvertToUTF8,SublimeAStyleFormatter插件,具体代表什么意思一下就清楚了。
3. 安装强大的SublimeClang插件
SublimeClang是Sublime Text中唯一的C/C++自动补全插件,功能强大,自带语法检查功能,不过最近作者已经停止更新了,目前只能在Sublime Text 2的Package Control中可以找到并自动安装,在SublimeText 3中只能手动通过源码安装,其代码线在https://github.com/quarnster/SublimeClang中。具体安装步骤如下:
安装相关软件
sudo apt-get install cmake build-essential clang git
cd ~/.config/sublime-text-3/Packages
git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
cd SublimeClang
cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so #这一步很重要,如果你的clang库不是3.4版本的话,请将对应版本的库拷贝到internals中
cd src
mkdir build
cd build
cmake ..
make
一切成功的话将会在SublimeClang/internals目录中生成libcache.so库文件。重启Sublime Text,然后按快捷键Ctrl + `(Esc下面那个键)打开自带的控制输出,看看有没有错误,如果没有错误就说明一切OK了。接下来就是配置自己的文件了,按下ctrl + shift + p快捷键,在弹出的输入框中输入 sublimeclang settings ,然后选择带User那一行,在打开的文件中输入如下信息:
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"options":
[
"-std=gnu++11",
"-isystem", "/usr/include",
"-isystem", "/usr/include/c++/*",
"-isystem", "/usr/include/c++/4.8",
"-isystem", "/usr/include/c++/4.8/*",
"-isystem", "/usr/include/boost",
"-isystem", "/usr/include/boost/**",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
]
}
注释:我的gcc版本为4.8,如果你的不是请替换对应的版本,在#include相应的头文件后保存当前文件,在接下来的操作中将更快的提示所包含在头文件的函数或者变量。
4. 工程实例
通过菜单栏中的Project -> Add Folder To Project...把你已有的原代码目录加入到Sublime Text中,然后通过Project -> Save Project As...来保存你的项目,这样就创建好了项目。例如我的机器在/media/WinE/WorkStation/Swift中有个C++项目,代码分别放在了Swift下的swift/base和swift/disruptor两个目录下,现在想要把这两个目录中的内容在写代码时能够自动提示则需要相应的配置修改。Project -> Edit Project,在所打开的配置文件中我更改如下:
{
"folders":
[
{
"follow_symlinks": true,
"path": "/media/WinE/WorkStation/Swift"
}
],
"settings":
{
"sublimeclang_options":
[
"-I/media/WinE/WorkStation/Swift",
"-I/media/WinE/WorkStation/Swift/swift/base",
"-I/media/WinE/WorkStation/Swift/swift/disruptor",
]
}
}
综合以上,如果你有什么问题,请能提出,大家一起进步,希望你能爱上个家伙。
‘捌’ Disruptor 源码分析 一个生产者和多个生产者的区别
disruptor一个生产者和多个生产者的区别
一个生产者的时候用的是SingleProcerSequencer,多个的时候用的是MultiProcerSequencer.
SingleProcerSequencer直接用cursor去判断,应为只有一个生产者的cursor,所以是没问题的.
public boolean isAvailable(long sequence)
{
return sequence <= cursor.get();
}
但是MultiProcerSequencer时候,每一个生产者都有cursor,disruptor采取的做法是用一个数组来存.
而且这个数组的大小和RingBuffer的大小是一样的.因为数组的一个位置只会由一个生产者获取,而且一个位置只能被某一圈的时候获取.
(获取一个位置两次,表示一个生产者从后面追上另外一个生产者,这个是不允许的.)
这里说说他们next方法的不同:
SingleProcerSequencer,完全不同sequence来表示位置,而是用了Padding类,缓存同样也用的是Padding类
private static class Padding
{
public long nextValue = Sequence.INITIAL_VALUE, cachedValue = Sequence.INITIAL_VALUE, p2, p3, p4, p5, p6, p7;
}
可以看到Padding的p2到p7是没用的,只是为了凑够64字节.因为cpu的缓存是64字节.这样做是为了避免缓存失效.Sequence类也做了同样的事情
可以看到Padding不是线程安全的,但是对于SingleProcerSequencer来说,只有一个生产者,足够了.
MultiProcerSequencer的next方法用cursor(Sequence类)来表示位置信息.用gatingSequenceCache(Sequence类)来缓存位置信息,这是为什么呢.
来看看Sequence类吧
public long get()
{
return UNSAFE.getLongVolatile(paddedValue, VALUE_OFFSET);
}
public void set(final long value)
{
UNSAFE.putOrderedLong(paddedValue, VALUE_OFFSET, value);
}
可以看到Sequence类是线程安全的,在MultiProcerSequencer 多个生产者的情况下必须要保障线程安全的.
但是说了这么多,感觉disruptor不可能会出现多个生产者.为什么呢.
在RingBuffer的构造函数中只能传入一个Sequencer对象,一个对象怎么多个生产者.
而且Sequencer不是线程类,完全没办法多线程.