![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Akka
文章平均质量分 85
TIGER_XC
一个Scala童鞋
展开
-
alpakka-kafka(10)-用kafka实现分布式近实时交易
随着网上购物消费模式热度的不断提高,网上销售平台上各种促销手段也层出不穷,其中“秒购”已经是各种网站普遍流行的促销方式了。“秒购”对数据的实效性和精确性要求非常高,所以通过分布式运算实现高并发数据处理应该是正确的选择。不过,高并发也意味着高频率的数据操作冲突,而高频使用“锁”又会严重影响效率及容易造成不可控异常,所以又被迫选择单线程运行模式。单线程、分布式表面相悖的,不过如上篇博文所述:可以利用akka-cluster-sharding分片可指定调用的特性将一种商品的所有操作放到同一个shard上运算(因为原创 2022-02-16 17:26:35 · 1078 阅读 · 0 评论 -
alpakka-kafka(9)-kafka在分布式运算中的应用
kafka具备的分布式、高吞吐、高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费。特别是exactly-once消费策略:可以保证每条消息肯定只被消费一次。换句话说就是在分布式运算环境里kafka的消息消费是能保证唯一性的。但是,保证了消息读取唯一性,消息的处理过程如果也放到分布式运算环境里仍然会面对数据完整性(data integrity)问题。例如:消息处理过程是更新银行账户中金额、消息内容是更新某个账户的指令,那么,对多条针对原创 2022-01-28 12:40:42 · 1773 阅读 · 0 评论 -
alpakka-kafka(8)-kafka数据消费模式实现
上篇介绍了kafka at-least-once消费模式。kafka消费模式以commit-offset的时间节点代表不同的消费模式,分别是:at-least-once, at-most-once, exactly-once。上篇介绍的at-least-once消费模式是通过kafka自身的auto-commit实现的。事后想了想,这个应该算是at-most-once模式,因为消费过程不会影响auto-commit,kafka在每个设定的间隔都会自动进行offset-commit。如果这个间隔够短,比整..原创 2021-08-15 14:21:58 · 361 阅读 · 0 评论 -
alpakka-kafka(7)-kafka应用案例,消费模式
上篇描述的kafka案例是个库存管理平台。是一个公共服务平台,为其它软件模块或第三方软件提供库存状态管理服务。当然,平台管理的目标必须是共享的,即库存是作为公共资源开放的。这个库存管理平台是一个Kafka消费端独立运行的软件。kafka的生产方即平台的服务对象通过kafka生产端producer从四面八方同时、集中将消息写入kafka。库存管理平台在kafka消费端不间断监控kafka里新的未读过的消息并及时读取,通过解析消息获取发布者对库存管理的指令,然后按指令更新库存状态。设计这个库存管理平...原创 2021-08-14 16:19:20 · 332 阅读 · 0 评论 -
alpakka-kafka(6)-kafka应用案例,用户接口
了解了kafka原理之后,对kafka的的应用场景有了一些想法。在下面的一系列讨论中把我最近的一个项目中对kafka的应用介绍一下。先介绍一下使用kafka的起因:任何销售系统,销售开单部分都应该算是核心部分了。这是一个销售数据录入...原创 2021-08-10 17:37:47 · 287 阅读 · 0 评论 -
alpakka-kafka(2)-consumer
alpakka-kafka-consumer简单的功能描述:向kafka订阅某些topic然后把读到的消息传给akka-streams做业务处理。在kafka-consumer的实现细节上,为了达到高可用、高吞吐的目的,topic又可用划分出多个分区partition。分区是分布在kafka集群节点broker上的。由于一个topic有多个partition,对应topic就会有多个consumer,就是一个consumer组,共同统一的groupid。一个partition只能对应一个consume...原创 2021-02-22 20:30:28 · 245 阅读 · 0 评论 -
alpakka-kafka(1)-producer
alpakka项目是一个基于akka-streams流处理编程工具的scala/java开源项目,通过提供connector连接各种数据源并在akka-streams里进行数据处理。alpakka-kafka就是alpakka项目里的kafka-connector。对于我们来说:可以用alpakka-kafka来对接kafka,使用kafka提供的功能。或者从另外一个角度讲:alpakka-kafka就是一个用akka-streams实现kafka功能的scala开发工具。...原创 2021-02-20 09:11:30 · 310 阅读 · 0 评论 -
kafka - 为CQRS而生
前段时间跟一个朋友聊起kafka,flint,spark这些是不是某种分布式运算框架。我自认为的分布式运算框架最基础条件是能够把多个集群节点当作一个完整的系统,然后程序好像是在同一台机器的内存里运行一样。当然,这种集成实现方式有赖于底层的一套消息系统。这套消息系统可以把消息随意在集群各节点之间自由传递。所以如果能够通过消息来驱动某段程序的运行,那么这段程序就有可能在集群中任何一个节点上运行了。好了,akka-cluster是通过对每个集群节点上的中介发送消息使之调动该节点上某段程序运行来实现分布式运算的..原创 2020-11-25 18:40:34 · 269 阅读 · 0 评论 -
akka-streams - 从应用角度学习:basic stream parts
实际上很早就写了一系列关于akka-streams的博客。但那个时候纯粹是为了了解akka而去学习的,主要是从了解akka-streams的原理为出发点的,因为akka-streams是akka系列工具的基础,如:akka-http, persistence-query等等。其实没有真正使用过akka-streams。这段时间所遇到的实际需求也是通过集合来解决的。不过,现在所处的环境还是逼迫着去真正了解akka-streams的应用场景。现状是这样的:跨入大数据时代,已经有大量的现代IT系统从传统关系...原创 2020-09-07 08:18:54 · 504 阅读 · 0 评论 -
akka-grpc - 应用案例
上期说道:http/2还属于一种不普及的技术,目前只适合用于内部系统集成。现在开始大面积介入可能为时尚早。不过有些项目需求不等人,需要使用这项技术,所以研究了一下akka-grpc,写了一篇介绍。本想到此为止,继续其它项目。想想这样做法有点不负责任,像是草草收场。毕竟用akka-grpc做了些事情,想想还是再写这篇跟大家分享使用kka-grpc的过程。我说过,了解akka-grpc的主要目的还是在protobuf的应用上。这是一种高效率的序列化协议。刚好,公司有这么个项目,是一个图像处理平台:把很多..原创 2020-08-29 09:57:19 · 424 阅读 · 0 评论 -
akka-grpc - 基于akka-http和akka-streams的scala gRPC开发工具
关于grpc,在前面的scalaPB讨论里已经做了详细的介绍:google gRPC是一种全新的RPC框架,在开源前一直是google内部使用的集成工具。gRPC支持通过http/2实现protobuf格式数据交换。protobuf即protocol buffer,是google发明的一套全新的序列化传输协议serialization-protocol,是二进制编码binary-encoded的,相对java-object,XML,Json等在空间上占有优势,所以数据传输效率较高。由于gRPC支持http.原创 2020-08-23 18:42:45 · 479 阅读 · 0 评论 -
akka-typed(10) - event-sourcing, CQRS实战
在前面的的讨论里已经介绍了CQRS读写分离模式的一些原理和在akka-typed应用中的实现方式。通过一段时间akka-typed的具体使用对一些经典akka应用的迁移升级,感觉最深的是EvenSourcedBehavior和akka-cluster-sharding了。前者是经典akka中persistenceActor的替换,后者是在原有组件基础上在使用方面的升级版。两者都在使用便捷性方面提供了大幅度的提升。在我看来,cluster-sharding是分布式应用的核心,如果能够比较容易掌握,对开发正确的原创 2020-08-16 11:24:08 · 304 阅读 · 0 评论 -
akka-typed(9) - 业务分片、整合,谈谈lagom, 需要吗?
在讨论lagom之前,先从遇到的需求开始介绍:现代企业的it系统变得越来越多元化、复杂化了。线上、线下各种系统必须用某种方式集成在一起。从各种it系统的基本共性分析:最明显的特征应该是后天数据库的角色了,起码,大家都需要使用数据。另外,每个系统都可能具备海量数据特性,代表着对数据处理能力有极大的要求,预示系统只有通过分布式处理方式才能有效运行。一个月前开始设计一个企业的it系统,在讨论数据中台时就遇到这样的需求。这个所谓的数据中台的主要作用是为整体系统提供一套统一的api,前后连接包括web,mob..原创 2020-08-09 08:47:02 · 363 阅读 · 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 · 326 阅读 · 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 · 503 阅读 · 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 · 324 阅读 · 0 评论 -
akka-typed(5) - cluster:集群节点状态监视
akka-cluster对每个节点的每种状态变化都会在系统消息队列里发布相关的事件。通过订阅有关节点状态变化的消息就可以获取每个节点的状态。这部分已经在之前关于akka-cluster的讨论里介绍过了。由于akka-typed里采用了新的消息交流协议,而系统消息的发布和订阅也算是消息交换,也受交流协议约束。所以想通过重写以前示范的ClusterMemberStatus来了解一下akka-typed环境下节点状态变化消息监听的一些机制。我们需要一个actor来订阅系统发布的节点状态变化消息。这里涉及...原创 2020-06-07 22:28:26 · 620 阅读 · 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 · 374 阅读 · 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 · 542 阅读 · 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 · 301 阅读 · 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 · 422 阅读 · 0 评论 -
restapi(9)- caching, akka-http 缓存
restapi作为前后端交互的枢纽:面对大批量的前端请求,需要确保回复的及时性。使用缓存是一项有效工具。我们可以把多数前端请求的回复response存入缓存,特别是一些需要大量计算才能获取的回复值,更可以大大提高后端的反应速度。值得庆幸的是akka-http已经提供了对缓存的支持,是基于java8caffein的一套缓存操作工具包的。下面就介绍一下akka-http的caching。akka...原创 2019-11-11 14:02:19 · 191 阅读 · 0 评论 -
Akka(1):Actor - 靠消息驱动的运算器
Akka是由各种角色和功能的Actor组成的,工作的主要原理是把一项巨大的计算任务分割成小环节,再按各环节的要求构建相应功能的Actor,然后把各环节运输托付给相应的Actor去独立完成。Akka是个工具库(Tools-Library),不是一个软件架构(Software-Framework),我们不需要按照Akka的框架格式去编写程序,而是直接按需要构建Actor去异步运算一项完整的功能。这样描原创 2017-04-29 17:08:14 · 741 阅读 · 0 评论 -
Akka(2):Actor生命周期管理 - 监控和监视
在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式。这是因为Actor是靠消息来驱动的,每种消息代表一项功能。由于消息驱动式的程序是松散耦合的,每项功能都可以在独立的线程中运算,互不干扰依赖,所以我们可以很自然的独立开发编制各项功能以及独立测试每项功原创 2017-05-24 12:26:26 · 1552 阅读 · 0 评论 -
Akka(0):聊聊对Akka的初步了解和想法
前一段时间一直沉浸在函数式编程模式里,主要目的之一是掌握一套安全可靠的并非程序编程方法。最终通过开源项目FunDA实现了单机多核CPU上程序的并行运算。但是,虽然通过在终端实现并行运算来充分利用多核CPU的计算能力把数据处理分担到前台来运算能大大减轻后台服务器的压力,提高了系统整体效率,对现今大数据普遍盛行的系统计算要求是远远不足的,只有通过硬件平行拓展(scale-out)形成机群并在之上实现分原创 2017-04-25 10:27:05 · 768 阅读 · 1 评论 -
Akka(3): Actor监管 - 细述BackoffSupervisor
在上一篇讨论中我们谈到了监管:在Akka中就是一种直属父子监管树结构。父级Actor负责处理直属子级Actor产生的异常。当时我们把BackoffSupervisor作为父子监管方式的其中一种。实际上BackoffSupervisor与定义了supervisorStrategy的Actor有所不同。我们应该把BackoffSupervisor看作是一个一体化的Actor。当然,它的实现方式还是由一原创 2017-05-29 19:36:35 · 720 阅读 · 0 评论 -
Akka(4): Routers - 智能任务分配
Actor模式最大的优点就是每个Actor都是一个独立的任务运算器。这种模式让我们很方便地把一项大型的任务分割成若干细小任务然后分配给不同的Actor去完成。优点是在设计时可以专注实现每个Actor的功能,在实际运算时由于每个Actor都在独立的线程里运行,能充分利用多核CPU的优势实现相似并行运算的效率。我们同样可以把一个独立的功能按不同的输入分配给多个Actor去完成以达到同样的效率提高目的,原创 2017-05-31 17:43:29 · 872 阅读 · 0 评论 -
Akka(5): ConsistentHashing Router - 可选定Routee的任务分配模式
上一篇讨论里我们介绍了几种任务分配(Routing)模式。Akka提供的几种现成智能化Routing模式大多数尝试通过对用户屏蔽具体的运算Routee选择方式来简化Router使用,提高智能程度。所以我们提到Router的运算是一种无序的运算,消息之间绝对不容许任何形式的依赖,向Router发送的消息可能在任何Routee上运算。但是,如果我们能够把运算任务按照任务的类型分配给负责处理此等类型任务原创 2017-06-05 16:17:07 · 1387 阅读 · 0 评论 -
Akka(8): 分布式运算:Remoting-远程查找式
Akka是一种由消息驱动的运算模式,它实现跨JVM的程序运算就是用能跨JVM的消息系统来调动分部在不同JVM上的Actor。Akka的消息系统原创 2017-06-21 09:10:29 · 595 阅读 · 0 评论 -
Akka(6): become/unbecome:运算行为切换
通过一段时间的学习了解,加深了一些对Akka的认识,特别是对于Akka在实际编程中的用途方面。我的想法,或者我希望利用Akka来达到的目的是这样的:作为传统方式编程的老兵,我们已经习惯了直线流程方式一口气实现完整的功能。如果使用Akka,我们可以把这个完整的功能分切成多个能产生中间临时结果的小功能然后把这些功能放到不同的Actor上分别独立运算,再通过消息来连接这些功能集合成最终结果。如此我们就轻原创 2017-06-09 12:22:32 · 528 阅读 · 0 评论 -
Akka(9): 分布式运算:Remoting-远程构建式
上篇我们讨论了Akka-Remoting。我们说Akka-Remoting是一种点对点的通讯协议,能使两个JVM上Akka-ActorSystem上的两个Actor之间可以相互沟通。Akka-Remoting还没有实现完全的Actor位置透明(location transparency),因为一个Actor还必须在获得对方Actor确切地址信息后才能启动与之沟通过程。Akka-Remoting支持原创 2017-06-22 10:40:09 · 491 阅读 · 1 评论 -
Akka(11): 分布式运算:集群-均衡负载
在上篇讨论里我们主要介绍了Akka-Cluster的基本原理。同时我们也确认了几个使用Akka-Cluster的重点:首先,Akka-Cluster集群构建与Actor编程没有直接的关联。集群构建是ActorSystem层面上的,可以是纯粹的配置和部署行为;分布式Actor程序编程实现了Actor消息地址的透明化,无须考虑目标运行环境是否分布式的,可以按正常的Actor编程模式进行。 既然分布式的Actor编程无须特别针对集群环境,那么摆在我们面前的就是多个可以直接使用的运算环境(集群节点)了,现在我们原创 2017-07-03 13:52:00 · 1315 阅读 · 0 评论 -
Akka(7): FSM:通过状态变化来转换运算行为
在上篇讨论里我们提到了become/unbecome。由于它们本质上是堆栈操作,所以只能在较少的状态切换下才能保证堆栈操作的协调及维持程序的清晰逻辑。对于比较复杂的程序流程,Akka提供了FSM:一种通过状态变化进行功能切换的Actor。FSM模式的状态转变特别适合对应现实情况中的程序流程,我们可以用每一种状态来代表一个程序流程。FSM是个trait,定义如下:原创 2017-06-13 10:18:26 · 654 阅读 · 0 评论 -
Akka(10): 分布式运算:集群-Cluster
Akka-Cluster可以在一部物理机或一组网络连接的服务器上搭建部署。用Akka开发同一版本的分布式程序可以在任何硬件环境中运行。这样我们就可以确定以Akka分布式程序作为标准的编程方式了。 在上面两篇讨论里我们介绍了Akka-Remoting。Akka-Remoting其实是一种ActorSystem之间Actor对Actor点对点的沟通协议。通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个Actorsystem中的另一个Actor之间的沟通。在Remot原创 2017-06-26 23:18:09 · 1404 阅读 · 1 评论 -
Akka(13): 分布式运算:Cluster-Sharding-运算的集群分片
通过上篇关于Cluster-Singleton的介绍,我们了解了Akka为分布式程序提供的编程支持:基于消息驱动的运算模式特别适合分布式程序编程,我们不需要特别的努力,只需要按照普通的Actor编程方式就可以实现集群分布式程序了。Cluster-Singleton可以保证无论集群节点出了任何问题,只要集群中还有节点在线,都可以持续的安全运算。Cluster-Singleton这种模式保证了某种Actor的唯一实例可以安全稳定地在集群环境下运行。还有一种情况就是如果有许多特别占用资源的Actor需要同时运行,原创 2017-07-14 14:26:02 · 2390 阅读 · 0 评论 -
Akka(12): 分布式运算:Cluster-Singleton-运算在集群节点中自动转移
在很多应用场景中都会出现在系统中需要某类Actor的唯一实例(only instance)。这个实例在集群环境中可能在任何一个节点上,但保证它是唯一的。Akka的Cluster-Singleton提供对这种Singleton Actor模式的支持,能做到当这个实例所在节点出现问题需要脱离集群时自动在另一个节点上构建一个同样的Actor,并重新转交控制。当然,由于涉及了一个新构建的Actor,内部状态会在这个过程中丢失。Single-Actor的主要应用包括某种对外部只能支持一个接入的程序接口,或者一种带有由原创 2017-07-10 11:28:11 · 1069 阅读 · 0 评论 -
Akka(16): 持久化模式:PersistentFSM-可以自动修复的状态机器
前面我们讨论过FSM,一种专门为维护内部状态而设计的Actor,它的特点是一套特殊的DSL能很方便地进行状态转换。FSM的状态转换模式特别适合对应现实中的业务流程,因为它那套DSL可以更形象的描述业务功能。为了实现FSM的可用性,就必须为FSM再增加自我修复能力,PersistentFSM是FSM和PersistentActor的合并,是在状态机器模式的基础上再增加了状态转变事件的持久化,从而实现内部状态的自我修复功能的。在FSM结构基础上,PersistentFSM又增加了领域事件(domain-even原创 2017-08-09 10:46:38 · 561 阅读 · 0 评论 -
Akka(18): Stream:组合数据流,组件-Graph components
akka-stream的数据流可以由一些组件组合而成。这些组件统称数据流图Graph,它描述了数据流向和处理环节。Source,Flow,Sink是最基础的Graph。用基础Graph又可以组合更复杂的复合Graph。如果一个Graph的所有端口(输入、输出)都是连接的话就是一个闭合流图RunnableGraph,否则就属于·开放流图PartialGraph。一个完整的(可运算的)数据流就是一个RunnableGraph。Graph的输出出入端口可以用Shape来描述:原创 2017-08-21 13:47:28 · 965 阅读 · 0 评论 -
Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定。一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回调地狱(callback hell)”,即所谓的“goto-hell”:程序控制跳来跳去很难跟踪,特别是一些变量如果在回调函数中更改后产生不可预料的结果。数据流(stream)是一种解决问题的有效编程方式。Stream是一个抽象概念,能把程序数据输入过程和其它细节隐蔽起来,通过申明方式把数据处理过程描述出来,使原创 2017-08-15 13:18:19 · 5064 阅读 · 1 评论