開發與維運

開發與維運

Flink 实时写入数据到 ElasticSearch 性能调优

作者:张刘毅 背景说明 线上业务反应使用 Flink 消费上游 kafka topic 里的轨迹数据出现 backpressure,数据积压严重。单次 bulk 的写入量为:3000/50mb/30s,并行度为 48。针对该问题,为了避免影响线上业务申请了一个与线上集群配置相同的 ES 集群。本着复现问题进行优化就能解决的思路进行调优测试。 测试环境 Elasticsearch 2.3.3 Flink 1.6.3 flink-connector-elasticsearch […]

開發與維運

天猫精灵业务如何使用机器学习PAI进行模型推理优化

作者:如切,悟双,楚哲,晓祥,旭林 引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备。天猫精灵目前是全球销量第三、中国销量第一的智能音箱品牌。 在天猫精灵业务系统中,大量使用了算法模型。如领域分类模型,意图分类模型,槽填充模型,多轮对话模型等。当前天猫精灵后台有上百个正在使用的算法模型。 在模型服务方面,有两个问题非常重要: 首先,为了保证服务能够得到快速响应,模型的 RT 必须尽可能的短。 其次,我们希望在硬件资源一定的情况下能够支持更多的 qps 访问,从而降低整体成本。 机器学习PAI是阿里巴巴AI开发平台,为AI开发者提供软硬一体的编程环境和高性能训练与推理引擎框架。 天猫精灵业务 PAI 模型的优化主要通过 AutoAI 接入 PAI Blade

開發與維運

重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长。但同时我们也关注到,Kubernetes 的核心 API 资源比如 Service、Deployment 等,实际上只是应用中的不同组成部分,并不能代表一个应用的全部。也许我们可以通过像 Helm charts 这样的方式来尝试表达一个可部署的应用,可一旦部署起来,实际运行的应用中却依旧缺乏以应用为中心的约束模型。这些问题都反映出,Kubernetes 以及云原生技术栈需要一种以应用为中心的 API 资源来提供一个专注于应用管理的、标准的、高度一致的模型,这个 API 资源可以代表完整运行的应用本身,而不仅仅是应用模板或者一个应用的几个组成部分,这就是今天阿里云与微软联合宣布推出开放应用模型 Open Application

開發與維運

带你读《Java并发编程的艺术》之一:并发编程的挑战

Java核心技术系列点击这里查看第二章:Java并发机制的底层实现原理点击这里查看第三章:Java内存模型 Java并发编程的艺术 方腾飞 魏鹏 程晓明 著 前  言 为什么要写这本书记得第一次写并发编程的文章时还是在2012年,当时花了几个星期的时间写了一篇文章《深入分析volatile的实现原理》,准备在自己的博客中发表。在同事建法的建议下,怀着试一试的心态投向了InfoQ,庆幸的是半小时后得到InfoQ主编采纳的回复,高兴之情无以言表。这也是我第一次在专业媒体上发表文章,而后在InfoQ编辑张龙的不断鼓励和支持下,我陆续在InfoQ发表了几篇与并发编程相关的文章,于是便形成了“聊聊并发”专栏。在这个专栏的写作过程中,我得到快速的成长和非常多的帮助,在此非常感谢InfoQ的编辑们。2013年,华章的福川兄找到我,问有没有兴趣写一本书,当时觉得自己资历尚浅,婉言拒绝了。后来和福川兄一直保持联系,最后允许我花两年的时间来完成本书,所以答应了下来。由于并发编程领域的技术点非常多且深,所以陆续又邀请了同事魏鹏和朋友晓明一起参与到本书的编写当中。 写本书的过程也是对自己研究和掌握的技术点进行整理的过程,希望本书能帮助读者快速掌握并发编程技术。 本书一共11章,由三名作者共同编写完成,其中第3章和第10章节由程晓明编写,第4章和第5章由魏鹏编写,其他7章由方腾飞编写。 本书特色本书结合JDK的源码介绍了Java并发框架、线程池的实现原理,帮助读者做到知其所以然。 本书对原理的剖析不仅仅局限于Java层面,而是深入到JVM,甚至CPU层面来进行讲解,帮助读者从更底层看并发技术。 本书结合线上应用,给出了一些并发编程实战技巧,以及线上处理并发问题的步骤和思路。 读者对象Java开发工程师架构师并发编程爱好者开设相关课程的大专院校师生 如何阅读本书阅读本书之前,你必须有一定的Java基础和开发经验,最好还有一定的并发编程基础。如果你是一名并发编程初学者,建议按照顺序阅读本书,并按照书中的例子进行编码和实战。如果你有一定的并发编程经验,可以把本书当做一个手册,直接看需要学习的章节。以下是各章节的基本介绍。 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何解决。第2章介绍Java并发编程的底层实现原理,介绍在CPU和JVM这个层面是如何帮助Java实现并发编程的。第3章介绍深入介绍了Java的内存模型。Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章试图揭开Java内存模型的神秘面纱。第4章从介绍多线程技术带来的好处开始,讲述了如何启动和终止线程以及线程的状态,详细阐述了多线程之间进行通信的基本方式和等待/通知经典范式。第5章介绍Java并发包中与锁相关的API和组件,以及这些API和组件的使用方式与实现细节。第6章介绍了Java中的大部分并发容器,并深入剖析其实现原理,让读者领略大师的设计技巧。第7章介绍了Java中的原子操作类,并给出一些实例。第8章介绍了Java中提供的并发工具类,这是并发编程中的瑞士军刀。第9章介绍了Java中的线程池实现原理和使用建议。第10章介绍了Executor框架的整体结构和成员组件。第11章介绍几个并发编程的实战,以及排查并发编程造成问题的方法。 精彩导读 第1章:并发编程的挑战 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本章会介绍几种并发编程的挑战以及解决方案。 1.1 上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。这就像我们同时读两本书,当我们在读一本英文的技术书时,发现某个单词不认识,于是便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。 1.1.1 多线程一定快吗下面的代码演示串行和并发执行并累加操作的时间,请分析:下面的代码并发执行一定比串行执行快吗? public class

開發與維運

带你读《Java并发编程的艺术》之二:Java并发机制的底层实现原理

点击这里查看第一章:并发编程的挑战点击这里查看第三章:Java内存模型 第2章:Java并发机制的底层实现原理 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。本章我们将深入底层一起探索下Java并发机制的底层实现原理。 2.1 volatile的应用 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。本文将深入分析在硬件层面上Intel处理器是如何实现volatile的,通过深入分析帮助我们正确地使用volatile变量。我们先从了解volatile的定义开始。 1.volatile的定义与实现原理Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。在了解volatile实现原理之前,我们先来看下与其实现原理相关的CPU术语与说明。表2-1是CPU术语的定义。 表2-1 CPU的术语定义 术语 英文单词 术语描述 内存屏障 memory barriers 是一组处理器指令,用于实现对内存操作的顺序限制 缓冲行 cache line 缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期 原子操作 atomic

開發與維運

带你读《Java并发编程的艺术》之三:Java内存模型

点击这里查看第一章:并发编程的挑战点击这里查看第二章:Java并发机制的底层实现原理 第3章:Java内存模型 Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章将揭开Java内存模型神秘的面纱。本章大致分4部分:Java内存模型的基础,主要介绍内存模型相关的基本概念;Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型;同步原语,主要介绍3个同步原语(synchronized、volatile和f?inal)的内存语义及重排序规则在处理器中的实现;Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和顺序一致性内存模型的关系。 3.1 Java内存模型的基础 3.1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。 3.1.2 Java内存模型的抽象结构在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享(本章用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(Exception Handler Parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意如图3-1所示。 图3-1 Java内存模型的抽象结构示意图 从图3-1来看,如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。2)线程B到主内存中去读取线程A之前已更新过的共享变量。下面通过示意图(见图3-2)来说明这两个步骤。 图3-2 线程之间的通信图 如图3-2所示,本地内存A和本地内存B由主内存中共享变量x的副本。假设初始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。 3.1.3 从源代码到指令序列的重排序在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型。1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。2)指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。3)内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如图3-3所示。 图3-3 从源码到最终执行的指令序列的示意图

開發與維運

API网关支持专享实例

信息摘要: API网关支持专享实例自助购买(北京、青岛、杭州、上海、深圳、新加坡、法兰克福) 适用客户: 开发者,企业,对API网关服务品质有更高要求的客户。版本/规格功能: 专享实例是API网关新推出的提供更高RPS与SLA的规格,用户可以通过支付规格配置费用自助购买更高的RPS,获取独享的资源,包含公网入口IP地址、仅允许自己VPC访问的的内网IP地址、公网出口带宽、独立隔离的服务器集群等,提供更高等级的SLA保障。专享实例的规格与定价请参考专享实例定价页面。 产品文档: https://help.aliyun.com/document_detail/118042.html?spm=a2c4g.11186623.6.576.21d772c31H1YHhhttps://www.aliyun.com/price/product?spm=5176.56205.824509.price3.596f28f1tdVBR3#/apigateway/detail

開發與維運

阿里云金融分布式架构 SOFAStack 公测发布

产品介绍: SOFAStack™(Scalable Open Financial Architecture Stack)包含构建金融级云原生架构所需的各个组件,也是在金融场景里锤炼出来的最佳实践。提供项目管理、微服务应用开发、部署发布、监控运维、容灾高可用等全栈式解决方案,并兼容Dubbo、Spring Cloud等微服务运行环境,提供基于虚拟机的经典PaaS运维和基于容器的云原生运维能力,助力客户各类应用轻松转型分布式和云原生架构。 SOFAStack代表着从支付宝创立之初就开始在关键金融交易系统锤炼出来的分布式架构实践。SOFAStack所有的产品技术都经过蚂蚁金服自身严苛金融场景验证,为金融交易技术在保证风险安全的同时,帮助业务需求敏捷迭代,同时满足异地容灾、低成本快速扩容的需求,解决传统集中式架构转型的困难,打造大规模高可用分布式系统架构,支撑金融业务创新。为满足金融业务发展和严苛场景考验,让云计算更懂金融。适用客户: 客户群体:对业务连续性、变更管控、分布式架构升级有需求,且蚂蚁金服的互联网金融基础设施场景对其有参照意义的机构客户。客户细分:金融行业如银行、证券、保险、消金等。发布功能: 分布式中间件:SOFAStack 的名称来自蚂蚁内部发展十多年的金融级分布式中间件 SOFA (Service Oriented Fabric Architecture),蚂蚁分布式中间件的产品发展路径,一直秉承引领和拥抱业界先进标准和实践,同时亦能满足传统金融架构的平滑迁移、融合适配,以稳妥应对业务升级变更,并积极应对金融交易系统所面临的服务和数据扩展性、事务一致性、秒级容灾、弹性供给与调度等关键技术挑战。 双模微服务,提供实现经典SDK模式和ServiceMesh 两种微服务模式所需的各种组件,致力于帮助企业快速构建高可扩展、高性能、低成本、轻量无侵入的分布式系统。 消息队列,在蚂蚁金服关键链路中历经十年实战打磨,是一款具备高可靠、高吞吐量、高可用、事务强一致性、可稳定支撑亿级数据洪峰的金融级消息中间件。 应用PaaS平台:SOFAStack

開發與維運

[集合] Itreator源码解析(3)

[[集合] Itreator源码解析(3)](https://copyfuture.com/blogs-details/20191017160706614rpgeagffzztaeod) 本篇文章不长,因为只介绍Itreator接口,而不涉及它的实现。 接口缘由 由于每一个容器都有取出元素的功能。这些功能定义都一样,只不过实现的具体方式不同(因为每一个容器的数据结构不一样)所以对共性的取出功能进行了抽取,从而出现了Iterator接口。而每一个容器都在其内部对该接口进行了内部类的实现。也就是将取出方式的细节进行封装。 Itreator接口是Jdk1.5之后添加的新接口, Collection的父接口。 实现了Iterable的类就是可迭代的。并且支持增强for循环。 该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。 (Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。 Collection接口继承了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)。 Iterable接口的源码主要方法就是iterator()、forEach(Consumer<? super T> action)、spliterator()(并行遍历),Iterable接口就不做过多介绍了。后面有机会再看。 接口介绍 Itreator直译过来就是迭代器,迭代可以简单的理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。 Iterator 模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。 Iterator是为了方便的处理集合中的元素,该接口提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.

開發與維運

《Flutter in action》开放下载!闲鱼Flutter企业级实践精选 | 开发者必读(083期)

最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》! 每日集成开发者社区精品内容,你身边的技术资讯管家。 每日头条 《Flutter in action》开放下载!闲鱼Flutter企业级实践精选 闲鱼是国内最早使用Flutter的团队,也是Flutter业务线渗入最深的团队之一。现在承载亿级流量的闲鱼将多年最佳实践经验整理成册,《Flutter in action》 正式面世! √ Google Flutter产品经理强烈推荐 ! √ 超全Flutter企业级实践指南 ! 最强干货 云栖PPT下载 |

Scroll to Top