编程技术
文章平均质量分 64
TIGER_XC
一个Scala童鞋
展开
-
alpakka-kafka(5)-kafka集群配置与分布式应用部署
在进入具体的kafka应用应用之前我们先把kafka集群环境配置介绍一下。多节点kafka-cluster的安装、配置非常简单,所以应该不用太多篇幅就可以完成一个完整可用的kafka-clusterhuan原创 2021-06-15 11:53:56 · 320 阅读 · 2 评论 -
alpakka-kafka(3)-kafka应用案例-需求分析
在大型复杂的应用中,业务模块之间总是相互关联,相互纠缠。无论业务管理或软件开发方面都会造成困惑:从业务管理方面难以厘清确切的管理范围和职责:就是说不知一项业务具体谁来管。在软件开发方面则无法确定开发人员的具体分工和维护责任,即确定一项业务功能具体靠谁来修改、优化。拿一个普通的网上购物过程来说,除商品拣选过程外的优惠价选定、库存扣减、支付都会涉及商品定价管理、库存管理、财务管理等独立的业务模块。如果纯从软件开发角度来描述:负责开发购物流程的开发人员还需要兼顾优惠价计算、库存扣减、支付等业务操作。因为商...原创 2021-03-21 22:22:12 · 251 阅读 · 1 评论 -
akka-typed(9) - 业务分片、整合,谈谈lagom, 需要吗?
在讨论lagom之前,先从遇到的需求开始介绍:现代企业的it系统变得越来越多元化、复杂化了。线上、线下各种系统必须用某种方式集成在一起。从各种it系统的基本共性分析:最明显的特征应该是后天数据库的角色了,起码,大家都需要使用数据。另外,每个系统都可能具备海量数据特性,代表着对数据处理能力有极大的要求,预示系统只有通过分布式处理方式才能有效运行。一个月前开始设计一个企业的it系统,在讨论数据中台时就遇到这样的需求。这个所谓的数据中台的主要作用是为整体系统提供一套统一的api,前后连接包括web,mob..原创 2020-08-09 08:47:02 · 365 阅读 · 0 评论 -
akka-typed(8) - CQRS读写分离模式
前面介绍了事件源(EventSource)和集群(cluster),现在到了讨论CQRS的时候了。CQRS即读写分离模式,由独立的写方程序和读方程序组成。akka-typed应该自然支持CQRS模式,最起码本身提供了对写方编程的支持,这点从EventSourcedBehavior 可以知道。akka-typed提供了新的EventSourcedBehavior-Actor,极大方便了对persistentActor的应用开发,但同时也给编程者造成了一些限制。如手工改变状态会更困难了,EventSour...原创 2020-06-26 09:27:24 · 327 阅读 · 0 评论 -
akka-typed(7) - cluster:sharding, 集群分片
在使用akka-typed的过程中发现有很多地方都简化了不少,变得更方便了,包括:Supervision,只要用Behaviors.supervise()把Behavior包住,很容易就可以实现这个actor的SupervisorStrategy.restartWithBackoff策略了。然后集群化的group router使用起来也很方便,再就是集群分片cluster-sharding了。下面我们就通过一个例子来介绍cluster-sharding的具体使用方法。首先,分片的意思是指在集群中多个..原创 2020-06-12 16:33:06 · 507 阅读 · 0 评论 -
akka-typed(6) - cluster:group router, cluster-load-balancing
先谈谈akka-typed的router actor。route 分pool router, group router两类。我们先看看pool-router的使用示范: val pool = Routers.pool(poolSize = 4)( // make sure the workers are restarted if they fail Behaviors.supervise(WorkerRoutee()).onFailure[Excepti...原创 2020-06-11 08:23:37 · 325 阅读 · 0 评论 -
akka-typed(5) - cluster:集群节点状态监视
akka-cluster对每个节点的每种状态变化都会在系统消息队列里发布相关的事件。通过订阅有关节点状态变化的消息就可以获取每个节点的状态。这部分已经在之前关于akka-cluster的讨论里介绍过了。由于akka-typed里采用了新的消息交流协议,而系统消息的发布和订阅也算是消息交换,也受交流协议约束。所以想通过重写以前示范的ClusterMemberStatus来了解一下akka-typed环境下节点状态变化消息监听的一些机制。我们需要一个actor来订阅系统发布的节点状态变化消息。这里涉及...原创 2020-06-07 22:28:26 · 621 阅读 · 0 评论 -
akka-typed(4) - EventSourcedBehavior in action
前面提到过,akka-type中较重要的改变是加入了EventSourcedBehavior。也就是说增加了一种专门负责EventSource模式的actor, 最终和其它种类的actor一道可以完美实现CQRS。新的actor,我还是把它称为persistentActor,还是一种能维护和维持运行状态的actor。即,actor内部状态可以存放在数据库里,然后通过一组功能函数来提供对状态的处理转变即持续化persistence。当然作为一种具备EventSourcedBehavior的actor, 普..原创 2020-06-06 12:18:40 · 378 阅读 · 0 评论 -
akka-typed(3) - PersistentActor has EventSourcedBehavior
akka-typed中已经没有PersistentActor了。取而代之的是带有EventSourcedBehavior的actor,也就是一种专门支持EventSource模式的actor。EventSource的原理和作用在之前的博客里已经有了比较详细的介绍,这里就不再重复了。本篇直接从EventsourcedBehavior actor的具体应用开始介绍。支持EventSource应用的基本数据类型包括 指令Command, 事件Event,状态State。EventSourcing其实就是一个...原创 2020-06-03 08:05:38 · 318 阅读 · 0 评论 -
akka-typed(2) - typed-actor交流方式和交流协议
akka系统是一个分布式的消息驱动系统。akka应用由一群负责不同运算工作的actor组成,每个actor都是被动等待外界的某种消息来驱动自己的作业。所以,通俗点描述:akka应用就是一群actor相互之间发送消息的系统,每个actor接收到消息后开始自己负责的工作。对于akka-typed来说,typed-actor只能接收指定类型的消息,所以actor之间的消息交流需要按照消息类型来进行,即需要协议来规范消息交流机制。想想看,如果用户需要一个actor做某件事,他必须用这个actor明白的消息类型...原创 2020-05-29 13:02:45 · 545 阅读 · 0 评论 -
akka-typed(1) - actor生命周期管理
akka-typed的actor从创建、启用、状态转换、停用、监视等生命周期管理方式和akka-classic还是有一定的不同之处。这篇我们就介绍一下akka-typed的actor生命周期管理。每一种actor都是通过定义它的行为属性behavior形成模版,然后由对上一层的父辈actor用spawn方法产生actor实例的。产生的actor实例加入一个系统的由上至下树形结构,直接在spawn产生自己的父辈之下。akka-typed的守护guardian-actor,即根部root-actor是...原创 2020-05-27 20:19:59 · 302 阅读 · 0 评论 -
akka-typed(0) - typed-actor, typed messages
akka 2.6.x正式发布以来已经有好一段时间了。核心变化是typed-actor的正式启用,当然persistence,cluster等模块也有较大变化。一开始从名称估摸就是把传统any类型的消息改成强类型消息,所以想拖一段时间看看到底能对我们现有基于akka-classic的应用软件有什么深层次的影响。不过最近再考虑的一些系统架构逼的我不得不立即开始akka-typed的调研,也就是说akka-classic已经无法或者很困难去实现新的系统架构,且听我道来:最近在考虑一个微服务中台。作为后台数据...原创 2020-05-26 21:45:01 · 425 阅读 · 0 评论 -
search(16)- elastic4s-内嵌文件:nested and join
从SQL来的用户,对于ES的文件关系维护方式会感到很不习惯。毕竟,ES是分布式数据库只能高效处理扁平类型文件,无法支持关系式数据库那样的文件拼接。但是,任何数据库应用都无法避免树型文件关系,因为这是业务模式里的表现形式。在ES里,父-子关系的数据实际上是放在同一个索引index里的,无论nested或join类型的数据。在ES里已经没有数据表(doc_type)的概念。但从操作层面上ES提供了relation类型来支持父-子数据关系操作。所以,nested数据类型一般用来表达比较固定的嵌入数据。因为每...原创 2020-05-23 09:35:32 · 307 阅读 · 0 评论 -
search(15)- elastic4s-sorting buckets
聚合结果buckets默认以doc_count排序方式呈现,即:_count asc 表达。其它还有 _term, _key 为排序控制元素。_key适用于histogram,date_histogram,如下:POST /cartxns/_search{ "aggs": { "colors": { "terms": { "field": "color.keyword", "order": { "_count": "...原创 2020-05-18 15:57:11 · 215 阅读 · 0 评论 -
search(14)- elastic4s-统计范围:global, filter,post-filter bucket
聚合一般作用在query范围内。不带query的aggregation请求实际上是在match_all{}查询范围内进行统计的:GET /cartxns/_search{ "aggs": { "all_colors": { "terms": {"field" : "color.keyword"} } } }}GET /cartxns/_search{ "query": { "match_all": {} }, "aggs": {..原创 2020-05-16 22:40:30 · 311 阅读 · 0 评论 -
search(13)- elastic4s-histograms:聚合直方图
在聚合的分组统计中我们会面临两种分组元素类型:连续型如时间,自然数等、离散型如地点、产品等。离散型数据本身就代表不同的组别,但连续型数据则需要手工按等长间隔进行切分了。下面是一个按价钱段聚合的例子:POST /cartxns/_search{ "size" : 1, "aggs": { "sales_per_pricerange": { "histogram": { "field": "price", "interval": 20000原创 2020-05-15 21:26:13 · 302 阅读 · 0 评论 -
search(6)- elastic4s-CRUD
这篇示范一下elastic4s的CRUD操作。在这之前先更正一下上篇中关于检查索引是否存在的方法。elastic4s的具体调用如下: //删除索引 val rspExists = client.execute(indexExists("company")).await if (rspExists.result.exists) client.execute(dele...原创 2020-04-21 21:14:12 · 224 阅读 · 0 评论 -
search(5)- elastic4s-构建索引
按照计划,这篇开始尝试用elastic4s来做一系列索引管理和搜索操作示范。前面提过,elastic4s的主要功能之一是通过组合Dsl语句形成json请求。那么我们先试试组合一些Dsl语句,再想办法产生出json请求文本,然后在kibana控制台中验证它的正确性。首先看看elastic4s提供的一个show函数: def show(implicit handler: Handl...原创 2020-04-18 20:17:26 · 165 阅读 · 0 评论 -
search(4)- elastic4s-ElasticDsl
上次分析了一下elastic4s的运算框架。本来计划接着开始实质的函数调用示范,不过看过了Elastic4s的所有使用说明文档后感觉还是走的快了一点。主要原因是elasticsearch在7.0后有了很多重点调整改变,elastic4s虽然一直在源代码方面紧跟ES的变化,但使用文件却一直未能更新,所以从说明文档中学习elastic4s的使用方法是不可能的,必须从源码中摸索。花了些时间过了一次...原创 2020-04-16 22:05:48 · 268 阅读 · 0 评论 -
search(3)- elastic4s-QueryDSL
elastic4s是elasticsearch一个第三方开发的scala语言终端工具库(Elastic4s is a concise, idiomatic, reactive, type safe Scala client for Elasticsearch.)。scala用户可以用elastic4s提供的DSL用编程代码形式来构建ES服务请求。与字符型json文本直接编写请求不同的是:在编译...原创 2020-03-22 22:29:26 · 233 阅读 · 0 评论 -
search(2)- elasticsearch scala终端:elastic4s
上篇谈到:elasticsearch本身是一个完整的搜索平台,操作使用是通过终端api进行的。elasticsearch本身提供了多种编程语言的api,包括java的esjava。而elastic4s是一套基于esjava之上的scala api。先看看scala es-client ElasticClient的构建过程: import com.sksamuel.elastic4...原创 2020-03-21 12:13:53 · 501 阅读 · 0 评论 -
search(1)- elasticsearch结构概念
上篇提到选择了elasticsearch ES作为专业化搜索引擎的核心,这篇讨论一下ES的基本结构和应用概念。首先,从硬结构方面来讲:ES是在一个集群(cluster)环境里运行的,所以ES应该具备高可用和高扩展特性,因为系统可以分布在机器内无数个节点(node)服务器上运行。ES的索引(index)在分布在集群中各node上。因为ES是基于lucent的,lucent index 就是集群...原创 2020-03-16 20:04:05 · 209 阅读 · 0 评论 -
search(0)- 企业搜索,写在前面
计划研究一下搜索search,然后写个学习过程系列博客。开动之前先说说学习搜索的目的:不是想开发个什么搜索引擎,而是想把搜索的概念和方法引入到传统的商业信息系统中去。对我来说,传统的管理系统legacy i.t system已经走到了尽头。根本原因是信息在量上的爆发增长,传统数据管理方式已经无法兼顾了。在我看来,除了交易管理,传统的关系数据库方式在业务管理的其它方面,特别是业务相关的数据分析、...原创 2020-02-28 17:06:12 · 200 阅读 · 0 评论 -
CassandraAppender - distributed logging,分布式软件logback-appender
农历年最后一场scala-meetup听刘颖分享专业软件开发经验,大受启发。突然意识到一直以来都没有完全按照任何标准的开发规范做事。诚然,在做技术调研和学习的过程中不会对规范操作有什么严格要求,一旦技术落地进入应用阶段,开始进行产品开发时,只有严格按照专业的软件开发规范才能保证软件产品的质量。刘颖在meetup中提到了异常处理(exception handling)和过程跟踪(logging...原创 2020-02-12 19:08:35 · 291 阅读 · 0 评论 -
泛函编程(9)-异常处理-Option
Option是一种新的数据类型。形象的来描述:Option就是一种特殊的List,都是把数据放在一个管子里;然后在管子内部对数据进行各种操作。所以Option的数据操作与List很相似。不同的是Option的管子内最多只能存放一个元素,在这个方面Option的数据操作就比List简单的多,因为使用者不必理会数据元素的位置、顺序。Option只有两种状态:包含一个任何类型的元素或者为空。或者这样讲:原创 2015-03-13 08:08:48 · 863 阅读 · 0 评论 -
泛函编程(10)-异常处理-Either
上节我们介绍了新的数据类型Option:一个专门对付异常情况出现时可以有一致反应所使用的数据类型。Option可以使编程人员不必理会出现异常后应该如何处理结果,他只是获得了一个None值,但这个None值与他所期待的类型是一致的,他可以继续用处理这种类型数据的方法使用这个结果。不过遗憾的是我们通过None值只能知道某个计算没能得出结果,但到底发生了什么事Option并没有提供任何提示。这样我们也就原创 2015-03-15 09:45:24 · 1186 阅读 · 0 评论 -
泛函编程(15)-泛函状态-随意数产生器
对于OOP程序员来说,泛函状态变迁(functional state transition)是一个陌生的课题。泛函状态变迁是通过泛函状态数据结构(functional state)来实现的。State是一个出现在泛函编程里的类型(type)。与其它数据类型一样,State同样需要自身的一套泛函操作函数和组合函数(combinators),我们将在以下章节中讨论有关State数据类型的设计方案。原创 2015-03-24 18:08:11 · 567 阅读 · 0 评论 -
泛函编程(13)-无穷数据流-Infinite Stream
上节我们提到Stream和List的主要分别是在于Stream的“延后计算“(lazy evaluation)特性。我们还讨论过在处理大规模排列数据集时,Stream可以一个一个把数据元素搬进内存并且可以逐个元素地进行处理操作。这让我不禁联想到我们常用的数据搜索读取方式了:大量的数据存放在数据库里,就好像无穷的数据源头。我们把数据读取方式(那些数据库读写API函数)嵌入Stream的操作函数内,把原创 2015-03-18 11:36:16 · 832 阅读 · 0 评论 -
实用的Scala泛函编程
既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,还是要通过实际的开发项目实例来展示如何编程。心目中已经有了一些设想;想用Scala泛函编程模式搞一个开源的数据平台应用系统,也就是在云平台PaaS层对上一层后台数据应用平台。当电子商务和云应用真正普及后将会出现一大批没有云应用软件开发能力的用户。作为一个真正的云服务提供商,单提供虚拟机租赁服务是远不足够的,必须提供一个具备计算资源自原创 2015-02-27 08:24:09 · 951 阅读 · 0 评论 -
泛函编程(3)-认识Scala和泛函编程
接着昨天的文章,再示范一个稍微复杂一点的尾递归tail recursion例子:计算第n个Fibonacci数。Fibonacci数第一、第二个数值分别是0,1,按顺序后面的数值是前面两个数的加合。例如:0,1,1,2,3,5... def fib(n: Int): Int = { @annotation.tailrec def go(cnt: Int, prev: Int,原创 2015-03-04 19:58:02 · 948 阅读 · 1 评论 -
泛函编程(1)-泛函编程是如何实现的
泛函编程就是把函数组合起来形成一个完整的程序。可以预见,组合的过程可以是曲折的,形成的程序可以是复杂的。泛函编程是如何保证一个复杂的函数组合是正确无误的呢?首先,泛函编程的函数组合(Composition)遵循一定的数学定律(Mathematical Laws),这保证了组成的函数具备要求的行为特征(Behavior)。再者,所有组件函数都必须具备行为不可变化特性,即无论在任何场合,它们的行为都不原创 2015-03-02 19:07:28 · 1979 阅读 · 0 评论 -
泛函编程(2)-初次体验泛函编程
泛函编程和数学解题相似;用某种方式找出问题的解决方案原创 2015-03-03 11:41:26 · 1051 阅读 · 0 评论 -
新一代编程:scala泛函编程技术-唠叨
准备了半年后,终于决定在这里开始我的scala编程技术体验撰写之旅。初步打算在这里把我学习、体验、掌握scala编程的过程与有兴趣的朋友分享。我想,虽然我这不是正式公文或者教课书之类的,但写个开场总是好的。以后都是技术性的表述了,还是把握最后机会唠叨一下吧。。。原创 2015-01-04 09:46:30 · 700 阅读 · 0 评论 -
泛函编程(0)-什么是泛函编程
什么是泛函编程(Functional Programming)?泛函编程就是用函数编写程序。这个回答太抽象,等于没说。再说清楚一点:泛函编程就想砌积木一样把函数当成积木块,把函数的输出输入作为积木的楔子和楔孔,把一个函数的输出当作另一个函数的输入组合成一个更大的函数。整个砌积木的过程就是泛函编程。嗯,这个稍微清楚了一点,不过这样做来干什么呢?相对于泛函编程模式还有指令编程模式(Impera原创 2015-03-02 16:14:44 · 2344 阅读 · 0 评论 -
怎样学习Scala泛函编程
应该说是wo原创 2015-02-27 08:29:13 · 1040 阅读 · 0 评论 -
泛函编程(11)-延后计算-lazy evaluation
在进入具体的Stream实现之前,先对泛函编程中比较特别的一个语言属性”计算时机“(strict-ness)做些介绍。strict-ness是指系统对一个表达式计算的时间点:立即计算的(strict),或者延迟计算的(non-strict or lazy)。non-strict或者lazy的意思是在使用一个表达式时才对它进行计值。用个简单直观的例子吧: def lazyFun(x: => I原创 2015-03-15 18:49:41 · 754 阅读 · 0 评论 -
泛函编程(4)-深入Scala函数类
山东队发低烧原创 2015-03-05 07:08:19 · 1012 阅读 · 0 评论 -
泛函编程(16)-泛函状态-Functional State
初接触泛函状态觉着很不习惯。主要是在使用State数据类型时很难理解其中的原理,特别是泛函状态变迁机制(state transition mechanism):怎么状态就起了变化,实在难以跟踪。我想这主要是因为状态变迁机制经过了函数组合,已经深深的埋藏在运行代码后面。上节我们讨论到RNG,对于了解State类型是个很好的开头。RNG简单描述了泛函方式的状态变迁及支持状态变迁所需要的数据结构和操作函原创 2015-03-26 11:31:21 · 947 阅读 · 0 评论 -
泛函编程(5)-数据结构(Functional Data Structures)
编程即是编制对数据进行运算的过程。特殊的运算必须用特定的数据结构来支持有效运算。如果没有数据结构的支持,我们就只能为每条数据申明一个内存地址了,然后使用这些地址来操作这些数据,也就是我们熟悉的申明变量再对变量进行读写这个过程了。试想想如果没有数据结构,那我们要申明多少个变量呢。所以说,数据结构是任何编程不可缺少的元素。 泛函编程使用泛函数据结构来支持泛函程序。泛函数据结构的特点是”不可变原创 2015-03-10 07:28:49 · 899 阅读 · 0 评论 -
泛函编程(17)-泛函状态-State In Action
对OOP编程人员来说,泛函状态State是一种全新的数据类型。我们在上节做了些介绍,在这节我们讨论一下State类型的应用:用一个具体的例子来示范如何使用State类型。以下是这个例子的具体描述:模拟一个自动糖果贩售机逻辑:贩售机有两种操作方法:投入硬币和扭动出糖旋钮。贩售机可以处于锁定和放开两种状态。模拟运作跟踪贩售机内当前的糖果和硬币数量。贩售机的操作逻辑要求如下:1、如果机内有糖的话原创 2015-03-27 09:25:05 · 728 阅读 · 0 评论