首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

跨越20亿美元收入门槛的红帽有话说

近期一则消息令整个开源界倍感振奋,那就是红帽的2015年年营收超过20亿美金。这对于红帽公司乃至整个开源界都是具有标杆意义的事件,因为这不光证明了红帽开源模式的商业成功,也从侧面反映了开源这种模式对于整个IT市场的影响在逐渐加深。 漂亮的财务数据 红帽公司亚太区高级副总裁兼总经理Dirk-Peter van Leeuwen 从2004年到今年,红帽的增长是非常连贯的,在过去56个季度我们都实现了持续的增长。红帽公司亚太区高级副总裁兼总经理Dirk-Peter van Leeuwen说,红帽在1993年成立,但是大家现在所知的红帽公司的商业模式其实是在2002年底才开始的。 据Dirk-Peter van Leeuwen介绍,红帽的收入主要分为两个部分,一部分是传统的IT基础架构产品,另一部分是新技术和新产品,其中包括应用程序的开发和培训、咨询服务。传统产品占红帽总收入的72%左右,但是新技术和产品的收入增长是非常强劲的。 红帽2015财年的收入超过了20亿美元,比之前一年同比增长21%;现金流达到7.16亿美元,比前一年同比增长15%;运营收入达到了4.84亿美元,同比增长21%。 这些漂亮的财务数据除了证明红帽的商业模式是成功,还有什么意义呢?Dirk-Peter van Leeuwen表示,这些证明了开源对于专有软件来说是一个可靠的方案,不是像以前那样仅仅是一个包含风险的实验。开源也可以提供可靠的IT基础架构,客户可以以更低的成本拿到更好的技术和产品。红帽让开源成为了主流。 Dirk-Peter van Leeuwen继续解释道,开源的软件依赖全世界的开发者社区,其开发过程本身并不是非常昂贵的。但是如果将开源项目变成一个企业使用的产品版本的话,你要确保这个版本是稳定的,并且要为它提供支持,这个过程要付出很大的成本。你要保持自己的相关能力,并且要能够认证与这个软件有关的软件和硬件。这正是红帽非常专业并且做得很成功的一个领域。对红帽的客户而言,他们可以享受红帽所提供的稳定的并且有支持的版本,这也是他们之所以付费让红帽提供支持的一个原因。 从20亿美金到50亿美金 在过去的一年,红帽在生态圈布局和产品方面都取得不错的成绩。比如与三星联合瞄准下一代企业移动方案,还有微软、曙光等。此外,红帽成为中国移动Open NFV实验室首批合作伙伴之一,助力华为建设NFV Open Lab等。 在产品方面,红帽发布了首个企业就绪型Web级容器应用平台OpenShift V3,还有红帽企业版OpenStack 7、云管理的平台CloudForms v4。红帽还收购了IT自动化与DevOps厂商Ansible。 红帽大中华区总裁张先民博士 红帽大中华区总裁张先民博士还表示,去年我们也欣喜地看到各行业企业都在积极拥抱开源,甚至大规模将开源商用技术产品应用在核心系统应用平台建设上。在去年10月红帽2015高峰论坛上,中国银行、招商银行、中国石油、深交所和华为的高管代表,现场接受了红帽CEO颁发的红帽2015亚太区创新企业奖项。 对于红帽漂亮的业绩,张先民表示,红帽觉得很骄傲。20亿美元是个什么概念?如果你看看50亿美元的软件公司也就只有五家:Microsoft、VMware、Salesforce、SAP、Oracle。红帽计划五年内将营收做到50亿美元。 为什么红帽有这样的底气?张先民说,因为红帽涉足的市场容量足够大,足以驱动红帽取得这样的成绩。比如服务器操作系统、中间件、虚拟化、云计算、存储等市场有着600亿美金的容量,而且红帽在这些市场都是主要的玩家。 目前开源是IT的大趋势,红帽能够成功不止是IT技术,最重要的是商业模式。红帽的商业模式简单来讲是把开源的项目变成一个能够被企业消费的产品,红帽作为企业与开放社区的桥梁。社区影响力+企业级产品+企业级服务+开放的生态体系,这就是红帽制胜的关键所在。张先民如是说。 总之,红帽帮助企业客户用开源的方式导入互联网公司的架构和创新,因为互联网公司使用的开源技术跟红帽都是同源的。红帽大中华区技术总监刘长春介绍说,红帽的解决方案更多是集中在敏捷的IT基础架构、DevOps、集成,从而帮助企业应对数字化转型。 未来中国市场的布局 在接下来在中国市场的布局,张先民说,红帽会集中于四个技术领域,分别是U2L、SDS和Ceph、OpenStack和NFV、容器技术。行业拓展会重点开拓金融、电信、政府与公共事业等,在OEM与嵌入式合作伙伴方面进行纵向与横向发展,红帽跟本土硬件厂商有更多的合作,从Linux扩展到OpenStack等领域。另外,红帽也会与渠道伙伴加强合作实现市场覆盖,加强新产品和方案的销售。 目前云市场是厂商争夺的焦点,红帽有着怎样的布局呢?张先民说,红帽不会涉足公有云市场,而是专注于IaaS和PaaS的产品。 刘长春补充说,简单说就是红帽帮助客户使用和管理云服务。红帽认为未来的世界是开放混合云的世界。红帽与公有云提供商合作在这些公有云平台上提供红帽的操作系统、中间件、PaaS等,为客户提供基础架构的技术方案。对于私有云,红帽在IaaS、PaaS、管理层有非常强的技术、方案、成熟的客户案例。 最终红帽认为这个世界是开放混合的,红帽针对混合云平台也做了很多技术积累。红帽的很多技术产品都是跨平台、跨公有云和私有云的,比如OpenShift和CloudForms这类管理工具都是基于Hybrid Cloud这个平台去构建的。 结语 从红帽的成长史看。红帽一直与生态合作伙伴努力让传统企业用户真正信任、容易消费开源技术,变成所有主流企业客户都可以使用的技术。虽然红帽的商业模式看似非常简单,但是经过十几年的发展,红帽已经在与开源社区的互动上形成了自己的一套实践经验。这不是一朝一夕就能做到的。 而红帽的年营收超过20亿美金说明红帽的模式是可行和经过验证的,开源在推动企业应对IT基础设施转型方面的作用正在变得越来越重要。 本文转自d1net(转载)

优秀的个人博客,低调大师

Storm入门之第7章使用非JVM语言开发

本文翻译自《Getting Started With Storm》译者:吴京润 编辑:郭蕾 方腾飞 有时候你可能想使用不是基于JVM的语言开发一个Storm工程,你可能更喜欢使用别的语言或者想使用用某种语言编写的库。 Storm是用Java实现的,你看到的所有这本书中的spout和bolt都是用java编写的。那么有可能使用像Python、Ruby、或者JavaScript这样的语言编写spout和bolt吗?答案是当然 可以!可以使用多语言协议达到这一目的。 多语言协议是Storm实现的一种特殊的协议,它使用标准输入输出作为spout和bolt进程间的通讯通道。消息以JSON格式或纯文本格式在通道中传递。 我们看一个用非JVM语言开发spout和bolt的简单例子。在这个例子中有一个spout产生从1到10,000的数字,一个bolt过滤素数,二者都用PHP实现。 NOTE: 在这个例子中,我们使用一个很笨的办法验证素数。有更好当然也更复杂的方法,它们已经超出了这个例子的范围。 有一个专门为Storm实现的PHP DSL(译者注:领域特定语言),我们将会在例子中展示我们的实现。首先定义拓扑。 ... TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("numbers-generator", new NumberGeneratorSpout(1, 10000)); builder.setBolt("prime-numbers-filter", new PrimeNumbersFilterBolt()).shuffleGrouping("numbers-generator"); StormTopology topology = builder.createTopology(); ... NOTE:有一种使用非JVM语言定义拓扑的方式。既然Storm拓扑是Thrift架构,而且Nimbus是一个Thrift守护进程,你就可以使用任何你想用的语言创建并提交拓扑。但是这已经超出了本书的范畴了。 这里没什么新鲜了。我们看一下NumbersGeneratorSpout的实现。 public class NumberGeneratorSpout extends ShellSpout implements IRichSpout { public NumberGeneratorSpout(Integer from, Integer to) { super("php", "-f", "NumberGeneratorSpout.php", from.toString(), to.toString()); } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("number")); } public Map<String, Object> getComponentConfiguration() { return null; } } 你可能已经注意到了,这个spout继承了ShellSpout。这是个由Storm提供的特殊的类,用来帮助你运行并控制用其它语言编写的spout。在这种情况下它告诉Storm如何执行你的PHP脚本。 NumberGeneratorSpout的PHP脚本向标准输出分发元组,并从标准输入读取确认或失败信号。 在开始实现NumberGeneratorSpout.php脚本之前,多观察一下多语言协议是如何工作的。 spout按照传递给构造器的参数从from到to顺序生成数字。 接下来看看PrimeNumbersFilterBolt。这个类实现了之前提到的壳。它告诉Storm如何执行你的PHP脚本。Storm为这一目的提供了一个特殊的叫做ShellBolt的类,你惟一要做的事就是指出如何运行脚本以及声明要分发的属性。 public class PrimeNumbersFilterBolt extends ShellBolt implements IRichBolt { public PrimeNumbersFilterBolt() { super("php", "-f", "PrimeNumbersFilterBolt.php"); } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("number")); } } 在这个构造器中只是告诉Storm如何运行PHP脚本。它与下列命令等价。 php -f PrimeNumbersFilterBolt.php PrimeNumbersFilterBolt.php脚本从标准输入读取元组,处理它们,然后向标准输出分发、确认或失败。在开始这个脚本之前,我们先多了解一些多语言协议的工作方式。 发起一次握手 开始循环 读/写元组 NOTE:有一种特殊的方式可以使用Storm的内建日志机制在你的脚本中记录日志,所以你不需要自己实现日志系统。 下面我们来看一看上述每一步的细节,以及如何用PHP实现它。 发起握手 为了控制整个流程(开始以及结束它),Storm需要知道它执行的脚本进程号(PID)。根据多语言协议,你的进程开始时发生的第一件事就是Storm要向标准输入(译者注:根据上下文理解,本章提到的标准输入输出都是从非JVM语言的角度理解的,这里提到的标准输入也就是PHP的标准输入)发送一段JSON数据,它包含Storm配置、拓扑上下文和一个进程号目录。它看起来就像下面的样子: { "conf": { "topology.message.timeout.secs": 3, // etc }, "context": { "task->component": { "1": "example-spout", "2": "__acker", "3": "example-bolt" }, "taskid": 3 }, "pidDir": "..." } 脚本进程必须在pidDir指定的目录下以自己的进程号为名字创建一个文件,并以JSON格式把进程号写到标准输出。 {"pid": 1234} 举个例子,如果你收到/tmp/example\n而你的脚本进程号是123,你应该创建一个名为/tmp/example/123的空文件并向标准输出打印文本行 {“pid”: 123}\n(译者注:此处原文只有一个n,译者猜测应是排版错误)和end\n。这样Storm就能持续追踪进程号并在它关闭时杀死脚本进程。下面是PHP实现: $config = json_decode(read_msg(), true); $heartbeatdir = $config['pidDir']; $pid = getmypid(); fclose(fopen("$heartbeatdir/$pid", "w")); storm_send(["pid"=>$pid]); flush(); 你已经实现了一个叫做read_msg的函数,用来处理从标准输入读取的消息。按照多语言协议的声明,消息可以是单行或多行JSON文本。一条消息以end\n结束。 function read_msg() { $msg = ""; while(true) { $l = fgets(STDIN); $line = substr($l,0,-1); if($line=="end") { break; } $msg = "$msg$line\n"; } return substr($msg, 0, -1); } function storm_send($json) { write_line(json_encode($json)); write_line("end"); } function write_line($line) { echo("$line\n"); } NOTE:flush()方法非常重要;有可能字符缓冲只有在积累到一定程度时才会清空。这意味着你的脚本可能会为了等待一个来自Storm的输入而永远挂起,而Storm却在等待来自你的脚本的输出。因此当你的脚本有内容输出时立即清空缓冲是很重要的。 开始循环以及读/写元组 这是整个工作中最重要的一步。这一步的实现取决于你开发的spout和bolt。 如果是spout,你应当开始分发元组。如果是bolt,就循环读取元组,处理它们,分发它发,确认成功或失败。 下面我们就看看用来分发数字的spout。 $from = intval($argv[1]); $to = intval($argv[2]); while(true) { $msg = read_msg(); $cmd = json_decode($msg, true); if ($cmd['command']=='next') { if ($from<$to) { storm_emit(array("$from")); $task_ids = read_msg(); $from++; } else { sleep(1); } } storm_sync(); } 从命令行获取参数from和to,并开始迭代。每次从Storm得到一条next消息,这意味着你已准备好分发下一个元组。 一旦你发送了所有的数字,而且没有更多元组可发了,就休眠一段时间。 为了确保脚本已准备好发送下一个元组,Storm会在发送下一条之前等待sync\n文本行。调用read_msg(),读取一条命令,解析JSON。 对于bolts来说,有少许不同。 while(true) { $msg = read_msg(); $tuple = json_decode($msg, true, 512, JSON_BIGINT_AS_STRING); if (!empty($tuple["id"])) { if (isPrime($tuple["tuple"][0])) { storm_emit(array($tuple["tuple"][0])); } storm_ack($tuple["id"]); } } 循环的从标准输入读取元组。解析读取每一条JSON消息,判断它是不是一个元组,如果是,再检查它是不是一个素数,如果是素数再次分发一个元组,否则就忽略掉,最后不论如何都要确认成功。 NOTE:在json_decode函数中使用的JSON_BIGINT_AS_STRING是为了解决一个在JAVA和PHP之间的数据转换问题。JAVA发送的一些很大的数字,在PHP中会丢失精度,这样就会导致问题。为了避开这个问题,告诉PHP把大数字当作字符串处理,并在JSON消息中输出数字时不使用双引号。PHP5.4.0或更高版本要求使用这个参数。 emit,ack,fail,以及log消息都是如下结构: emit { "command": "emit", "tuple": ["foo", "bar"] } 其中的数组包含了你分发的元组数据。 ack { "command": "ack", "id": 123456789 } 其中的id就是你处理的元组的ID。fail { "command": "fail", "id": 123456789 } 与ack(译者注:原文是emit从上下JSON的内容和每个方法的功能上判断此处就是ack,可能是排版错误)相同,其中id就是你处理的元组ID。log { "command": "log", "msg": "some message to be logged by storm." } 下面是完整的的PHP代码。 //你的spout: <?php function read_msg() { $msg = ""; while(true) { $l = fgets(STDIN); $line = substr($l,0,-1); if ($line=="end") { break; } $msg = "$msg$line\n"; } return substr($msg, 0, -1); } function write_line($line) { echo("$line\n"); } function storm_emit($tuple) { $msg = array("command" => "emit", "tuple" => $tuple); storm_send($msg); } function storm_send($json) { write_line(json_encode($json)); write_line("end"); } function storm_sync() { storm_send(array("command" => "sync")); } function storm_log($msg) { $msg = array("command" => "log", "msg" => $msg); storm_send($msg); flush(); } $config = json_decode(read_msg(), true); $heartbeatdir = $config['pidDir']; $pid = getmypid(); fclose(fopen("$heartbeatdir/$pid", "w")); storm_send(["pid"=>$pid]); flush(); $from = intval($argv[1]); $to = intval($argv[2]); while(true) { $msg = read_msg(); $cmd = json_decode($msg, true); if ($cmd['command']=='next') { if ($from<$to) { storm_emit(array("$from")); $task_ids = read_msg(); $from++; } else { sleep(1); } } storm_sync(); } ?> //你的bolt: <?php function isPrime($number) { if ($number < 2) { return false; } if ($number==2) { return true; } for ($i=2; $i<=$number-1; $i++) { if ($number % $i == 0) { return false; } } return true; } function read_msg() { $msg = ""; while(true) { $l = fgets(STDIN); $line = substr($l,0,-1); if ($line=="end") { break; } $msg = "$msg$line\n"; } return substr($msg, 0, -1); } function write_line($line) { echo("$line\n"); } function storm_emit($tuple) { $msg = array("command" => "emit", "tuple" => $tuple); storm_send($msg); } function storm_send($json) { write_line(json_encode($json)); write_line("end"); } function storm_ack($id) { storm_send(["command"=>"ack", "id"=>"$id"]); } function storm_log($msg) { $msg = array("command" => "log", "msg" => "$msg"); storm_send($msg); } $config = json_decode(read_msg(), true); $heartbeatdir = $config['pidDir']; $pid = getmypid(); fclose(fopen("$heartbeatdir/$pid", "w")); storm_send(["pid"=>$pid]); flush(); while(true) { $msg = read_msg(); $tuple = json_decode($msg, true, 512, JSON_BIGINT_AS_STRING); if (!empty($tuple["id"])) { if (isPrime($tuple["tuple"][0])) { storm_emit(array($tuple["tuple"][0])); } storm_ack($tuple["id"]); } } ?> NOTE:需要重点指出的是,应当把所有的脚本文件保存在你的工程目录下的一个名为multilang/resources的子目录中。这个子目录被包含在发送给工人进程的jar文件中。如果你不把脚本包含在这个目录中,Storm就不能运行它们,并抛出一个错误。 文章转自并发编程网-ifeve.com

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册