开发者需要理解的分布式原语

随着容器技术的崛起,开发人员的思维也从单主机扩展到了分布式。Bilgin Ibryam在Red Hat官方博客上介绍了什么是分布式原语,以及它与进程内原语之间的联系。本文已获得作者翻译授权,查看原文New Distributed Primitives for Developers。

面向对象的原语(进程内原语)

作为一个Java开发者,我熟悉面向对象概念,比如类、对象、继承、封装、多态,等等。除了面向对象,我也熟悉Java运行时,比如它提供了哪些特性,它是如何管理应用程序的,对象和应用程序的生命周期是怎样的,等等。

十多年来,作为一名开发人员,我使用这些工具、原语和构建块来创建应用程序。在我的意识里,我把类看成组件,它生成对象,并由JVM来管理它们。不过,这种模型近来在发生变化。

Kubernetes的原语(分布式原语)

我从去年开始在Kubernetes上运行Java应用程序,Kubernetes为我们引入了新的概念和工具。有了Kubernetes,我就不再局限于使用面向对象和JVM原语来实现应用程序功能。虽然我仍然需要使用面向对象的构件块来创建应用程序组件,但也可以借助Kubernetes原语来实现部分的应用程序功能。

例如,我正在尝试将应用程序组件单元放入独立的容器镜像,让它们成为主要的构建块。这样我就可以使用Kubernetes提供的一系列丰富的组件来实现应用程序功能。现在,我除了可以使用ExecutorService来实现服务定期作业,还可以使用Kubernetes的CronJob原语来定期运行容器。

Kubernetes的CronJob也提供了一些类似的基于时间的行为,不过它使用的是更加高级的组件,并依赖调度器完成动态配置、执行健康检查,在作业完成之后关闭容器。这一切让作业的运行更具弹性,对资源的使用也更加优化。如果我要执行应用程序的初始化操作,除了可以使用对象的构造函数,还可以使Kubernetes的init-container从更高层面来实现初始化。

脑海里的分布式模型

将本地进程内原语(面向对象和JVM特性)和由Kubernetes提供的进程外分布式原语结合起来,开发人员就可以更好地创建应用程序。在构建一个分布式的应用程序时,我的意识不再局限于一个JVM,而是扩散到一组运行着JVM的主机上。

进程内原语与分布式原语有一些共性,但它们之间不具有直接的可比性。它们运行在不同的抽象层之上,有不同的前提条件,并提供了不一样的保证。有一些原语可以放在一起使用,比如我们使用类来创建对象,并把对象放入容器镜像。不过有一些原语可以相互替代,比如Kubernetes的CronJob完全可以替代Java里的ExecutorService。以下列出我发现的JVM和Kubernetes之间的部分共性。

新的原语为解决问题提供了新的方式,有些重复性的方案变成了模式。可以参考“Kubernetes模式”这本书了解更多这方面的内容。

关于作者

Bilgin Ibryam是Apache软件基金会成员,Red Hat的集成架构师,一个软件工匠和博主。他热爱开源,热衷分布式系统、消息传递和应用集成。他同时是“Camel设计模式”和“Kubernetes模式”的作者。

原文地址:http://www.infoq.com/cn/news/2017/04/Developers-distributed-primitive


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

转载自 Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码 美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。 为什么说是长期版本,看下面的官方发布的支持路线图表。 可以看出…

c/c++ 字符串分割

c/c 字符串分割 vector<string> split_string(const char *str, const char *pattern) {char * strc (char*)str;vector<string> res;char* temp strtok(strc, pattern);while(temp ! NULL){res.push_back(string(temp));temp strtok(NULL, pattern);}return re…

JS中的命名规则

在JS中所有的可以自主命名的内容&#xff0c;都可以认为是一个标识符&#xff0c; 是标识符就应该遵守标识符的规范。 比如&#xff1a;变量名、函数名、属性名 规范&#xff1a; 1.标识符中可以含有字母、数字、_、$ 2.标识符不能以数字开头 3.标识符不能是JS中的关键字和保…

mssql on linux 安装指导

通常在本机开发环境中需要搭建所有的服务&#xff0c;还要修改本地的hosts&#xff0c;实在是不胜其烦。如今有了docker&#xff0c;完全不用污染本地环境&#xff0c;且看老司机带你搭建一个asp.net core的开发环境集群。愿你走出虚拟机&#xff0c;归来仍是干净的开发机。 教…

互联网账户系统的具体实现

转载自 互联网账户系统的具体实现 导读 在上一篇文章中我们通过场景举例的方式&#xff0c;讨论了一套相对通用的互联网业务账户系统&#xff0c;从业务模型上应该如何定义。那么除了从业务模型上进行定义外&#xff0c;在具体系统实现上又该如何设计&#xff1f;又有哪些需…

JDBC简单总结

一、java集合框架包含的内容&#xff1a; 1.Collection ①List接口: a.ArrayList实现类&#xff1a;实现了长度可变的数组&#xff0c;遍历数据的时候效率比较高 b.LinkedList实现类&#xff1a;采用链表存储方式&#xff0c;插入和删除元素的时候效率比较高 ②Set接口: a.Hash…

ubuntu 16.4 安装postgreSQL,使C++链接到数据库

1、安装postgreSQL Ubuntu下编译安装postgreSQL 10.5 https://blog.csdn.net/lc_2014c/article/details/84189162 2、安装驱动Libpqxx下载 编译报错 安装sudo apt-get install libpq-dev 3.设置数据库允许远程登录 ubuntu设置postgresql允许被远程访问 https://blog.csdn.net/…

JS进行性能测试(计时)

//测试如下的程序的性能//在程序执行前&#xff0c;开启计时器//console.time("计时器的名字")可以用来开启一个计时器//它需要一个字符串作为参数&#xff0c;这个字符串将会作为计时器的标识console.time("test");//终止计时器//console.timeEnd()用来停…

.NET 的一点历史往事:和 Java 的恩怨

在编程语言的发展历史上&#xff0c;1995年应该是个特殊的年头&#xff0c;毕竟这个年头诞生了两个后来二十多年影响深远的语言。1995年5月23日的 SunWorld 大会上面 Sun 公司高调发布了自己研发了近五年的 Java 语言和 JVM 平台。当年的十二月&#xff0c;网景公司将自己刚刚预…

这可能是史上最全 Redis 高可用解决方案总结

转载自 这可能是史上最全 Redis 高可用解决方案总结 本文主要针对 Redis 常见的几种使用方式及其优缺点展开分析。 一、常见使用方式 Redis 的几种常见使用方式包括&#xff1a; Redis 单副本&#xff1b; Redis 多副本&#xff08;主从&#xff09;&#xff1b; Redis S…

ubuntu下inotifywait实现目录、文件监控【包含子目录】

inotifywait命令 【命令格式】: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ … ] 【命令原意】: inote file system wait 【命令路径】: 【命令功能】: 等待所监听的文件系统触发操作事件 【执行权限】: root 【命令描述】: 众所周知&#xff0c;Linux 桌面系统与 …

JS向对象中添加和删除属性

向对象中添加属性 语法&#xff1a; 对象.属性名 属性值; 对象[“属性名”] 属性值; //这种方式能够使用特殊的属性名 对象的属性名没有任何要求&#xff0c;不需要遵守标识符的规范&#xff0c;但是在开发中&#xff0c;尽量按照标识符的要求去写。 属性值也可以任意的数据…

规模化微服务——《微服务设计》读书笔记

改变思维的角度&#xff1a;故障无处不在 当微服务规模化后&#xff0c;故障是无可避免的&#xff0c;以往我们总是想尽力避免故障的发生&#xff0c;而当故障实际发生时&#xff0c;我们往往束手无策。我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生&#xff…

oracle基础

一、Oracle简介&#xff1a; 1.版本&#xff1a;8i/9i-10g/11g(目前我们使用的是11g) 二、数据库&#xff1a; 1.在物理上表现为数据文件、日志文件和控制文件等。 2.在逻辑上以表空间的形式存在 3.首先需要创建数据库才能使用oracle 三、数据库实例&#xff1a; 每个启动的数据…

一个致命的 Redis 命令,导致公司损失 400 万

转载自 一个致命的 Redis 命令&#xff0c;导致公司损失 400 万 最近安全事故濒发啊&#xff0c;前几天发生了《顺丰高级运维工程师的删库事件》&#xff0c;今天又看到了 PHP 工程师在线执行了 Redis 危险命令导致某公司损失 400 万。。 什么样的 Redis 命令会有如此威力&a…

JS中的基本和引用类型传递的比较

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">/** 基本数据类型* String Number Boolean Null Undefined* * 引用数据类型* Object* * JS中的变量都是保…

oracle应用

一、使用jdbc连接oracle数据库&#xff1a; 1.将ojdbc6.jar放在lib中 2.将ojdbc6.jar右击–》build path–>add build path 3.加载驱动&#xff1a; Class.forName(“oracle.jdbc.driver.OracleDriver”); 4.建立连接: Connection conn DriverManage.getconnection(“jdbc:…

./NISwGSP: error while loading shared libraries: libopencv_stitching.so.3.0: cannot open shared obje

error while loading shared libraries: libopencv_highgui.so.3.0: cannot open shared object file: No such file or directory 找不到需要的库。 locate libopencv_imgcodecs.so.3.0 查找这个库的所在目录&#xff0c;发现在/usr/local/opencv-3.0.0/目录下 在/etc/ld.s…

如何在 ASP.NET Core 中发送邮件

前言 我们知道目前 .NET Core 还不支持 SMTP 协议&#xff0c;当我么在使用到发送邮件功能的时候&#xff0c;需要借助于一些第三方组件来达到目的&#xff0c;今天给大家介绍两款开源的邮件发送组件&#xff0c;它们分别是 MailKit 和 FluentEmail &#xff0c; 下面我对它们…

一文搞懂 Java 线程中断

转载自 一文搞懂 Java 线程中断 在之前的一文《如何"优雅"地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程&#xff0c;那么还有别的可以终止线程的方法吗&#xff1f;答案是肯定的&#xff0c;它就是我们今天要分享的——线程中断。 下面…