标签分类
当前位置:首页 > 程序设计电子书 > Akka电子书网盘下载
Akka实战:快速构建高可用分布式应用 Akka实战:快速构建高可用分布式应用
萧曳丶

萧曳丶 提供上传

资源
33
粉丝
23
喜欢
25
评论
15

    Akka实战:快速构建高可用分布式应用 PDF 影印版

    Akka电子书
    • 发布时间:

    给大家带来的一篇关于Akka相关的电子书资源,介绍了关于Akka实战、分布式应用方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小137.1 MB,杜云飞编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.3,更多相关的学习资源可以参阅 程序设计电子书Java视频Java电子书、等栏目。

  • Akka实战:快速构建高可用分布式应用 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1Jtw1V8uhtD5UYYWvbfV3vQ
  • 分享码:wqp4
  • Akka实战:快速构建高可用分布式应用

    Akka实战:快速构建高可用分布式应用

    读者评价

    国人写的难得好书 Actor模型和Akka 特性解释的特别清晰 个人以为比「Akka in Action」说的明白 尤其是有几章写了 Akka Stream 和 Akka HTTP 这些高级扩展 非常受用 美中不足的是 这本书的例子是Java写的 有利有弊吧 对于初学者上手容易些 但是看起来很变扭 瑕不掩瑜!
    作为首版原创Akka书籍,我认为还是OK的,里面以Java版作为基础进行讲解我认为也算是和其他同类书籍的差异化亮点了,因为Scala相关的书籍其实已经有了(貌似是翻译的...)
    这本书不厚,着重实战讲解,对Stream的覆盖不够多(这块儿内容其实可以独立成书),版本的话个人认为是合适的,实际上生产环境并不一定就是用最新的。。。
    总体来说,我觉得已经很好了,另外原创本身值得鼓励,可以为很多人打开了Akka的大门啊

    内容介绍

    本书一共分为10章,全面介绍了Akka的基础架构、Actor模型、常用组件、分布式&集群、微服务等。下面是各个章节的简介及阅读说明。第1章介绍了Akka的技术背景、应用场景及架构体系,为大家日后做技术选型提供参考依据。第2章介绍了Actor的相关概念、常见用法、生命周期、容错处理等。第3章介绍了Dispatcher的用途和常见配置方法。第4章介绍了邮箱的常见类型及配置,同时也给出了一个自定义邮箱类型的简单案例。第5章介绍了消息路由器的基本概念和创建方式(Pool和Group),然后分别演示了几种常见路由策略。第6章介绍了Akka的一些实用工具包,如Future、EventBus等。第7、8章介绍了Akka分布式&集群相关的内容。第9章介绍了如何使用Akka构建HTTP和WebSocket服务,并完整实现了一个图文聊天系统。第10章介绍了一款“全家桶式”的微服务框架Lagom。

    目录

    • 前言
    • 第1章 认识Akka1
    • 1.1 Akka简介1
    • 1.1.1 技术背景1
    • 1.1.2 Akka是什么3
    • 1.2 Akka应用场景4
    • 1.3 Akka架构体系4
    • 1.3.1 Actor模型4
    • 1.3.2 体系结构4
    • 1.4 本章小结7
    • 第2章 走进Actor8
    • 2.1 Actor组件8
    • 2.1.1 Akka中的Actor8
    • 2.1.2 ActorSystem与监管9
    • 2.1.3 生命周期监控9
    • 2.1.4 引用与路径10
    • 2.2 Akka环境搭建10
    • 2.2.1 环境准备11
    • 2.2.2 使用Lightbend Activator平台12
    • 2.3 创建一个Actor14
    • 2.3.1 定义Actor14
    • 2.3.2 创建Actor实例14
    • 2.3.3 工厂模式---Props/Creator15
    • 2.4 发送-接收消息16
    • 2.4.1 tell方法16
    • 2.4.2 ask方法17
    • 2.4.3 消息转发18
    • 2.5 查找一个Actor18
    • 2.6 消息不可变21
    • 2.7 Actor行为切换21
    • 2.8 Actor生命周期25
    • 2.9 停掉一个Actor26
    • 2.10 监督与容错处理29
    • 2.11 Circuit Breaker(熔断)33
    • 2.12 配置相关35
    • 2.13 本章小结36
    • 第3章 线程调度38
    • 3.1 什么是Dispatcher?38
    • 3.2 Executor选择39
    • 3.3 配置Dispatcher39
    • 3.4 使用Dispatcher41
    • 3.5 PinnedDispatcher41
    • 3.6 本章小结42
    • 第4章 邮箱43
    • 4.1 消息处理顺序43
    • 4.2 默认邮箱配置44
    • 4.3 内置邮箱45
    • 4.3.1 内置邮箱说明45
    • 4.3.2 自定义优先级45
    • 4.3.3 控制指令优先48
    • 4.4 Actor使用邮箱的多种方式49
    • 4.4.1 配置Actor邮箱49
    • 4.4.2 配置dispatcher邮箱49
    • 4.4.3 实现RequiresMessageQueue接口50
    • 4.5 自定义邮箱类型50
    • 4.6 本章小结52
    • 第5章 消息路由53
    • 5.1 Router和Routee53
    • 5.2 路由器及路由逻辑53
    • 5.3 路由Actor56
    • 5.3.1 Pool方式56
    • 5.3.2 Group方式58
    • 5.4 常见路由类型59
    • 5.4.1 广播-Broadcast60
    • 5.4.2 最快响应-ScatterGatherFirstCompleted61
    • 5.4.3 随机-最快响应-TailChopping62
    • 5.4.4 创建可修改容量的池62
    • 5.5 特殊消息处理63
    • 5.5.1 Broadcast消息64
    • 5.5.2 PoisonPill消息64
    • 5.5.3 其他管理类消息64
    • 5.6 本章小结65
    • 第6章 实用工具67
    • 6.1 定时调度—Scheduler67
    • 6.2 处理并发结果—Future68
    • 6.2.1 Future常规用法68
    • 6.2.2 函数式Future70
    • 6.3 事件总线72
    • 6.3.1 实现事件总线72
    • 6.3.2 事件流处理74
    • 6.4 日志处理75
    • 6.4.1 基础配置76
    • 6.4.2 使用slf4j76
    • 6.5 Akka扩展78
    • 6.5.1 TypedActor初探78
    • 6.5.2 自定义扩展81
    • 6.5.3 集成Spring83
    • 6.6 Akka I/O87
    • 6.6.1 TCP服务87
    • 6.6.2 UDP服务90
    • 6.7 Akka Streams91
    • 6.7.1 Streams组件91
    • 6.7.2 组合Source、Sink94
    • 6.7.3 案例:日志处理95
    • 6.7.4 错误处理99
    • 6.7.5 关联Actor101
    • 6.8 本章小结102
    • 第7章 远程103
    • 7.1 远程介绍103
    • 7.1.1 Java RPC103
    • 7.1.2 Akka远程106
    • 7.2 创建远程ActorSystem107
    • 7.3 Actor远程访问108
    • 7.4 创建远程Actor109
    • 7.5 远程路由器110
    • 7.6 远程事件113
    • 7.7 序列化114
    • 7.7.1 Protobuf框架114
    • 7.7.2 序列化API115
    • 7.8 本章小结116
    • 第8章 集群117
    • 8.1 Akka集群概述117
    • 8.1.1 种子节点118
    • 8.1.2 领导节点118
    • 8.1.3 节点状态及生命周期118
    • 8.1.4 故障检测119
    • 8.2 创建Akka集群119
    • 8.2.1 代码及集群配置119
    • 8.2.2 启动集群122
    • 8.2.3 加入集群123
    • 8.2.4 akka-cluster集群工具123
    • 8.3 集群示例—实现文章单词统计125
    • 8.3.1 示例分析125
    • 8.3.2 代码实现127
    • 8.4 使用路由133
    • 8.4.1 Group路由133
    • 8.4.2 Pool路由133
    • 8.5 集群指标136
    • 8.5.1 指标收集136
    • 8.5.2 基于指标的负载均衡138
    • 8.6 集群单例139
    • 8.7 集群客户端140
    • 8.7.1 集群客户端概述140
    • 8.7.2 使用 ClusterClient141
    • 8.7.3 事件监听142
    • 8.8 集群分片143
    • 8.8.1 分片概念143
    • 8.8.2 持久化Actor144
    • 8.8.3 分片示例148
    • 8.9 本章小结155
    • 第9章 HTTP服务156
    • 9.1 HTTP协议156
    • 9.1.1 header信息157
    • 9.1.2 状态码159
    • 9.2 Akka HTTP159
    • 9.2.1 配置依赖159
    • 9.2.2 HTTP服务端160
    • 9.2.3 请求和响应160
    • 9.2.4 HTTP客户端163
    • 9.2.5 使用Routing DSL163
    • 9.2.6 常用Directive165
    • 9.3 Akka WebSocket166
    • 9.3.1 WebSocket协议167
    • 9.3.2 Akka WebSocket167
    • 9.3.3 WebSocket应用之聊天室169
    • 9.4 本章小结176
    • 第10章 微服务全家桶之Lagom177
    • 10.1 Lagom简介177
    • 10.2 Lagom初探178
    • 10.3 搭建Lagom服务181
    • 10.3.1 项目结构181
    • 10.3.2 编写Lagom服务182
    • 10.4 持久化实体186
    • 10.4.1 持久化简介186
    • 10.4.2 PersistentEntity API187
    • 10.4.3 持久化示例187
    • 10.4.4 MySQL支持191
    • 10.5 Lagom部署(SandBox)192
    • 10.5.1 安装ConductR SandBox192
    • 10.5.2 部署Maven项目195
    • 10.6 本章小结199

    上一篇:30天App开发从0到1 APICloud移动开发实战  下一篇:机器学习实战

    展开 +

    收起 -

    Akka相关电子书
    学习笔记
    网友NO.313299

    Redisson分布式锁源码解析

    Redisson锁继承Implements Reentrant Lock,所以具备 Reentrant Lock 锁中的一些特性:超时,重试,可中断等。加上Redisson中Redis具备分布式的特性,所以非常适合用来做Java中的分布式锁。 下面我们对其加锁、解锁过程中的源码细节进行一一分析。 锁的接口定义了一下方法: 分布式锁当中加锁,我们常用的加锁接口: boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException; 下面我们来看一下方法的具体实现: public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException { long time = unit.toMillis(waitTime); long current = System.currentTimeMillis(); final long threadId = Thread.currentThread().getId(); Long ttl = tryAcquire(leaseTime, unit, threadId); // lock acquired if (ttl == null) { return true; } time -= (System.currentTimeMillis() - current); if (time = 0) { acquireFailed(threadId); return false; } current = System.currentTimeMillis(); final RFuture subscribeFuture = subscribe(threadId); if (!await(subscribeFuture, time, TimeUnit.MILLISECONDS)) { if (!subscribeFuture.cancel(false)) { subscribeFuture.addListener(new FutureListener() { @Override public void operationComplete(Future future) throws Exception { if (subscribeFuture.isSuccess()) { unsubscribe(subscribeFuture, threadId); } } }); } acquireFailed(threadId); return false; } try { time -= (System.currentTimeMillis() - current); if (time = 0) { acqui……

    网友NO.948693

    Python多进程入门、分布式进程数据共享实例详解

    本文实例讲述了Python多进程入门、分布式进程数据共享。分享给大家供大家参考,具体如下: python多进程入门 https://docs.python.org/3/library/multiprocessing.html 1、先来个简单的 # coding: utf-8from multiprocessing import Process# 定义函数def addUser(): print("addUser")if __name__ == "__main__": p1 = Process(target=addUser) p1.start() 多进程包 multiprocessing ; 创建进程 p1 = Process(target=函数名) ; 开始进程 p1.start() 。 2、通过进程ID来区分父子进程 # coding: utf-8from multiprocessing import Processimport os# 定义一个listmyList = ["a","b"];# 定义函数def addUser(list): print(os.getpid()) # 进程ID print(os.getppid()) # 父进程IDif __name__ == "__main__": p1 = Process(target=addUser,args=(myList,)) p1.start() # 这里是主进程 print("父进程ID:"+str(os.getpid())) # 进程ID 父进程ID:27084 27085 27084 3、主进程等等子进程执行完毕 # 定义一个listmyList = ["a","b"];# 定义函数def addUser(list): list.append("c") print(list)if __name__ == "__main__": p1 = Process(target=addUser,args=(myList,)) p1.start() print(myList) ['a', 'b'] ['a', 'b', 'c'] 主线程的 print(myList) 先于子进程的 print(list) 执行。 在主进程里,只需要加一句代码: p1.join() # 等待子进程执行完毕print(myList) ['a', 'b', 'c'] ['a', 'b'] 执行的顺序就不一样了。 分布式进程数据共享 通过 Manager 实现数据共享。 Manager会创建一个服务进程,其……

    网友NO.179705

    Spring Cloud Config实现分布式配置中心

    在分布式系统中,配置文件散落在每个项目中,难于集中管理,抑或修改了配置需要重启才能生效。下面我们使用 Spring Cloud Config 来解决这个痛点。 Config Server 我们把 config-server 作为 Config Server,只需要加入依赖: dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-config-server/artifactId/dependency 在 application.yml 中,进行配置: spring: application: name: config-server # 名称 cloud: config: server: git: uri: file://Users/yangdd/Documents/code/GitHub/config-repo # 使用本地仓库(用于测试),格式为:file://${user.home}/config-repo 如果是 Windows 则是 file:///${user.home}/config-repo #uri: https://github.com/yangdd1205/spring-cloud-master/ #username: 用户名 #password: 密码 #default-label: config # 可以是 commit id,branch name, tag name,默认值为 master #search-paths: # 表示除了在根目录搜索配置文件,还可以在以下目录搜索 #- user server: port: 4001 # 端口 Spring 的项目,一般有个“约定大于配置”的原则。所以我们 Git 中的配置文件,一般以 {application}-{profile}.yml 或者 {application}-{profile}.properties 命名。 {appliction} 映射到客户端 spring.application.name 属性值 {profile} 映射到客户端 spring.profiles.active 属性值 我们在 config-repo 的 master 分支中,有两个文件 client-dev.yml : info: master-dev client-prod.yml : info: master-prod 在 config 分……

    网友NO.814248

    Python使用分布式锁的代码演示示例

    在计算机并发领域编程中总是会与锁打交道,锁又有很多种,互斥锁、自旋锁等等。 锁总是伴随着线程、进程这样的词汇出现,阮一峰有 一篇文章 对这些名词进行了简单易懂的解释。 我的理解是,使用线程、进程是为了实现并发从而获得性能的提升(利用多核CPU,多台服务器),但这种并发由于调度的不确定性,很容易出乱子,为了(在一些共享资源、关键节点上)不出乱子,又需要对资源加锁,在操作这个资源时控制这种并发,将乱子消灭。 很多语言都提供了一些线程级别的锁实现以及一些相应的工具,但在进程方面就无能为力了。而一个服务部署到生产环境,往往会部署多个实例,这种情况下,就经常会用到给不同进程用的锁,分布式锁便是在分布式系统中对某共享资源进行加锁的构件。 现在来试着展示一下在Python项目中如何使用简单的分布式互斥锁。 不使用分布式锁会怎样 先用一个简单的实例来演示一下,不使用分布式锁会出怎样的乱子。 假设商城系统要做秒杀活动,在redis中记录着 count:1 的信息,到秒杀时间点的时候,会收到许多的请求,这时各应用程序去查redis中count的值,若count还大于0,则将count-1,这样其他请求就不再能秒杀到了。 # -*- coding: utf-8 -*-import osimport arrowimport redisfrom multiprocessing import PoolHOT_KEY ……

    网友NO.23561
    网友NO.23561

    业务需要,小组内部搭建了一个基于akka简单的分布式集群,尽量轻量级。
    业务场景,简要说下,目前业务数据量比较大,且还在以每天几十万的数据量递增,现在需要根据这些历史数据,从不同的维度,且维度可能组合,统计相关业务数据,其中包括数据挖掘,数据运营,同时还有可能业务告警,同时还要求数据尽量及时,而且考虑到后续可扩展,可以增加任意其他维度,能够快速响应等,

    从上面的描述中,我们可以提供几个关键字,大数据,实时统计,多维度统计,快速接入等,这些其实公司内部是有些平台和框架可以满足的,用hadoop跑job来解决,但不够实时,且接入还是有点麻烦,所以我们产生了一个想法,自己搭建一个小型集群,毕竟数据量不是很大,而且akka这个框架,宣传还是挺强大的,也比较成熟,但也需要能够驾驭它,引入一种新技术,最好还是能够解决一些问题,并且有足够的驾驭能力,否则发布到线上,有问题的话,那就死翘翘了,这里我将分几个部分,把最近学习的一些akka心得,记录在此,前面我写过的文章可能都虎头蛇尾,但后续会慢慢补上,零碎的时间比较多,没法集中精力和时间来系统学习,只能能够用这种方式来写这些文章了。

    网友NO.43143
    网友NO.43143

    Actor是什么
    曾经看到知乎上有人提过actor就是cpu上的时间片,这种说法非常贴切。Actor之间通过消息进行通讯,一切都是异步的。可以说Actor就像现实生活中的一群人,他们各司其职,互相通过消息进行交流,一个actor收到另外一个actor发来的消息后会按照消息的内容去执行指定的任务,接着再将新任务传递下去或者将执行结果返回给消息发送方。Actor这种模型很好地解决了传统java并发带来的各种问题。
    Actor和线程的区别
    Actor规避了传统多线程中锁的问题,在Actor中是没有共享变量的,一切都是无状态的,尽管我们可以在actor中去调用一个新的线程去进行一些异步操作,但是这并不符合Actor本身的理念,并且会破坏Actor的整体设计。要记住一点,Actor是单线程运行的,一个Actor同时只能处理一条消息,我们可以通过增加Actor的数量来提高系统并行处理的能力。
    Actor是如何执行的
    AKKA中使用dispatcher对actor进行执行,当一个actor启动之后会将自身绑定到一个dispatcher上,我们可以在系统配置中定义自己的dispathcer。Dispatcher本身其实是一个线程池,默认的dispatcher是一个fork-join-executor,读者可以参考下表来了解不通的dispatcher。

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明