值得庆幸的是akka-http已经提供了对缓存的支持,是基于java8 caffein的一套缓存操作工具包的。下面就介绍一下akka-http的caching。...akka-http caching 有个依赖: "com.typesafe.akka" %% "akka-http-caching" % akkaHttpVersion, 先从缓存存储结构开始,看看下面的一段缓存结构定义...: import akka.http.scaladsl.util.FastFuture import akka.http.caching.scaladsl.Cache import akka.http.caching.scaladsl.CachingSettings...[Map[String, Any]]] = rows.runWith(Sink.lastOption) Await.result(futUI, 3 seconds) } 当收到前端 http...import akka.http.caching.scaladsl.CachingSettings import akka.http.caching.LfuCache import akka.http.scaladsl.server.RequestContext
Akka-http routing DSL在Route运算中抛出的异常是由内向外浮出的:当内层Route未能捕获异常时,外一层Route会接着尝试捕捉,依次向外扩展。...Akka-http提供了ExceptionHandler类来处理Route运算产生的异常: trait ExceptionHandler extends ExceptionHandler.PF {...留下未捕获的异常向外层Route浮出。当未处理异常到达最外层Route时统一由最顶层的handler处理。...} } 第一种办法是一种顶层对所有未捕获异常统一处理的方式,第二种办法可以限制处理区域针对某层以内的Route进行异常捕捉。...} } } 下面是本次讨论中的示范源代码: import akka.actor._ import akka.http.scaladsl.Http import akka.http.scaladsl.model
SSE模式的基本原理是服务端统一集中发布消息,各客户端持久订阅服务端发布的消息并从消息的内容中筛选出属于自己应该执行的指令,然后进行相应的处理。...当收到有用的消息后就会调用一个业务功能函数作为后台异步运算任务。 服务端的SSE发布是以Source[ServerSentEvent,NotUsed]来实现的。...[String] = None, id: Option[String] = None, retry: Option[Int] = None) {...}...keepAlive(1.second, () => ServerSentEvent.heartbeat) } 以上代码代表服务端定时运算processToServerSentEvent返回...import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.server.Directives
值得注意的是mapAsync通过这个返回的Future来实现stream backpressure,也就是说这个运算Actor必须返回结果,否则Stream就会挂在那里了。...、StorageActor生命周期callback来跟踪异常发生时SupervisorStrategy.Restart的执行情况。...: None") } super.preRestart(reason, message) } 如果我们不需要委托给Actor运算任务的返回结果,可以尝试用Sink.actorRefWithAck...这个Actor只返回backpressure消息ackMessage,而不是返回任何运算结果。注意,在preRestart里我们把造成异常的元素处理后再补发给了自己。...在receive函数里我们把offer用法以及它可能产生的返回结果通过pipeTo都做了示范。
的轻量级REST/HTTP工具包。...如何使用路由中的队列Actor来完成HTTP请求? 关于Spray的好处是,它只是将一个RequestContext实例传递给你的路由,并不期待任何返回。这取决于路由是完全放弃请求还是使用一个值完成。...LookupQueue(newQueueData.name)).apply() queueActorOption match { case None => { val createResult...这看起来像完全正常的顺序代码,但是在执行时,从第一次使用Future开始将会异步运行。 长轮询 因为所有的代码都是异步和非阻塞的,实现长轮询非常容易。...使用Akka调度程序,我们还计划在指定的超时之后发回空列表并删除条目。 当新消息到达时,我们只需从map上获取一个等待请求,然后尝试完成它。同样,所有同步和并发问题都由Akka和参与者模型来处理。
想想这种做法恰恰是面向对象编程或所谓行令式编程的特点,即:通过逐行执行命令引导程序的状态改变,最终状态就是运行程序的结果了,或者就是功能的实现了。通过一行行增加代码最终总会到达预期的状态,不是吗。...Future[Long] repository.count(upData.pid).toFuture[Long] 下载图片:这个返回Future[ByteString] import akka.actor.ActorSystem...import akka.http.scaladsl.model._ import akka.http.scaladsl.Http def downloadPicture(url...def addPicuture(pid: String,seqno: Int, optDesc: Option[String] ,optWid:Option[Int...注意它的类型还是future:意味这我们无法预测这个运算什么时候会完成,特别如果下载一张超大图片又或者网速缓慢的话,很可能在下载完成之前就执行了complete()。
打印这句话 单词 返回 hadoop 大数据分布式存储和计算框架 zookeeper 大数据分布式协调服务框架 spark 大数据分布式内存计算框架 未匹配 未匹配 参考代码 println("请输出一个词...后续,我们在开发Akka案例时,还会用到。...Option类型 使用Option类型,可以用来有效避免空引用(null)异常。也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。...=> println("除零异常") } } 示例二 示例说明 重写上述案例,使用getOrElse方法,当除零时,或者默认值为0 参考代码 def dvi(a:Double, b:Double...:异常类型2 => // 代码 } finally { // 代码 } try中的代码是我们编写的业务处理代码 在catch中表示当出现某个异常时,需要执行的代码 在finally中,是不管是否出现异常都会执行的代码
case _ => s"未匹配到$name" } println(result) match表达式是有返回值的,可以将match表达式对其他的变量进行赋值 守卫 在Java中,只能简单地添加多个case...后续,我们在开发Akka案例时,还会用到。...这种类型的数据有两种形式: Some(x):表示实际的值 None:表示没有值 使用Option类型,可以用来有效避免空引用(null)异常。...也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。... => println("除零异常") } } getOrElse方法 使用getOrElse方法,当Option对应的实例是None时,可以指定一个默认值,从而避免空指针异常 示例: val
的轻量级REST/HTTP工具包。...这是一个来自CreateQueueDirectives的例子: (序列化代码sequential code,也有翻译成顺序代码的,即按顺序执行的代码,过程中不存在多线程异步操作,译者注) flow {...LookupQueue(newQueueData.name)).apply() queueActorOption match { case None => { val createResult...这看起来像完全正常的序列化代码,但是在执行时,因为第一次Future是第一次使用将会异步运行。 长轮询 由于所有的代码都是异步和非阻塞的,实现长轮询非常容易。...使用Akka调度程序,我们还计划在指定的时间超过之后发回空列表并删除条目。 当新消息到达时,我们只需从map上等待一个请求,然后尝试去完成它。
如果在处理消息时引发异常,则可以重新启动 Actor(详见「supervision」)。...重新启动涉及上述挂钩: 通过调用导致preRestart的异常和触发该异常的消息来通知旧 Actor ;如果重新启动不是由处理消息引起的,则后者可能为None,例如,当监督者不捕获异常并由其监督者依次重新启动时...Akka 还不能强制执行不可变性,所以必须按惯例执行。...警告:要完成带异常的,你需要向发件人发送akka.actor.Status.Failure消息。当 Actor 在处理消息时抛出异常,不会自动执行此操作。...Actor 和异常 当 Actor 处理消息时,可能会引发某种异常,例如数据库异常。 消息发生了什么 如果在处理邮件时引发异常(即从邮箱中取出并移交给当前行为),则此邮件将丢失。
mozilla/geckodriver/releases Chrome 浏览器驱动:https://chromedriver.storage.googleapis.com/index.html IE 浏览器驱动:http...= webdriver.ChromeOptions() option.add_experimental_option("detach", True) driver = webdriver.Chrome...(text) 新版元素定位(推荐) 新版元素定位将所有定位函数封装成两个函数 # 返回定位到的第一个元素 find_element(self, by=By.ID, value=None) # 返回列表...driver.find_elements(By.CLASS_NAME, 'hello') # 也可以不传入By,直接用属性值 driver.find_element('id', 'world') 元素等待 当元素还没有被加载出来时...显式等待 设置一个超时时间,期间确定某个条件触发,则继续运行程序,否则抛出异常。
---- 构建微服务并不容易,特别是当微服务变得越来越多时,而且好多微服务可能由不同的团队提供和维护,这些微服务彼此交互并且变化很快。...“Category”对象列表,该函数接受一个HttpRequest并返回一个HttpResponse。...import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model....我们也可以尝试执行Pact test(MyLibraryClientPactSpec),但它会失败,因为它应该执行一个真正的HTTP调用,scala-pact框架将启动一个真实的HTTP服务器,接受和响应协议中描述的请求...categories,InteractionRequest(Some(GET),Some(/search/category),None,None,None,None),InteractionResponse
排查日志 查阅Kafka日志发现,在节点磁盘爆满之前,未见异常。换句话说,日志没有记录过期数据删除失败的信息,说明不是删除失败而是未触发删除。...该任务延迟执行时间为InitialTaskDelayMs(即30*1000),任务执行周期为retentionCheckMs(即log.retention.check.interval.ms,默认5 minutes...segment.largestTimestamp就很关键了,直接决定shouldDelete返回true还是false,具体是什么呢?...经过上述排查剖析,我们可以得出该问题的基本结论:客户producer写到Kafka的数据携带了timestamp且timestamp的值属于未来时间(其实还可能是未携带timestamp,但是producer...一个segment中的数据一旦携带了未来时间的timestamp,就会出现该segment过期未触发删除的现象。
Checkpoint介绍 checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保...如果一个算子有两个输入源,则暂时阻塞先收到barrier的输入源,等到第二个输入源相 同编号的barrier到来时,再制作自身快照并向下游广播该barrier。具体如下图所示: ?...3) 当输入源B发出的barrier到来时,算子C制作自身快照并向 CheckpointCoordinator 报告自身的快照制作情况,然后将两个barrier合并为一个,向下游所有的算子广播。...如果checkpoint未启动,就会采用 no restart 策略,如果启动了checkpoint机制,但是未指定重启策略的话,就会采用 fixed-delay 策略,重试 Integer.MAX_VALUE...重启策略 重启策略值 Fixed delay fixed-delay Failure rate failure-rate No restart None 除了定义一个默认的重启策略之外,你还可以为每一个
Akka-http的客户端Api应该是以HttpRequest操作为主轴的网上消息交换模式编程工具。我们知道:Akka-http是搭建在Akka-stream之上的。...所以,Akka-http在客户端构建与服务器的连接通道也可以用Akka-stream的Flow来表示。...*/ def outgoingConnection(host: String, port: Int = 80, localAddress: Option...一般来讲,当返回response的entity被完全消耗后系统会自动close connection,这套api还提供了一些手动方法可以在有需要的情况下手动进行connection close,如下:...://kazuhiro.github.io/scala/akka/akka-http/akka-streams/2016/01/31/connection-pooling-with-akka-http-and-source-queue.html
CORS简单来说就是跨域资源共享,当跨域进行Ajax请求的时候进行权限验证等操作。...其实细细想来倒是这么回事,Cesium请求瓦片一定用的是XMLHttpRequest,而我的TMS又未使用CORS,于是怎么折腾都出不来结果,当然对这块不太熟悉是导致问题发生的直接原因。...首先添加一个CorsSupport特质,如下: import akka.http.scaladsl.model.HttpHeader import akka.http.scaladsl.model.HttpMethods...._ import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.model.headers.Origin...import akka.http.scaladsl.server.Directive0 import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.MethodRejection
收到事件 E 时,要做什么业务动作 Acton 当状态从 A 转换 到 B 时。要做什么事情 这也是我们观察一个状态机的两个视角。...无返回值。...这里使用了两个scala 的语法机制 : 当參数列表中仅仅有一个參数时。能够使用花括号取代圆括号。...[Cancellable] = None FSM.State[S, D] 有一个成员 timeout: Option[FiniteDuration] ,这是一个超时的可选项,缺省值是 None。...假设是因为 Actor 终止(出现异常或正常退出Actor),postStop函数会以当前状态启动终止流程(650行)。
注意:当连接的结束位置被读取,它们中有一些会引发EOFError异常,因为有其他原因,它们会返回一个空字符串。请看单个方法的文档字符串。...(telnet socket, command, option) 当没有option参数时,option参数会是chr(0)(就是0的ASCII码——'\0')。...否则,当没有匹配时,返回(-1, None, text)在这里text参数是目前被接收到的内容(如果出现了超时,可能是一个空字符串)。...read_lazy(self) 处理并返回已经在队列中的数据(惰性)。 如果连接被关闭,并且没有可用数据,就引发EOFError异常。在其他情况下,如果没有可用数据,就返回空字节。...read_until(self, match, timeout=None) 一直读,直到遇见一个被传入的字符串或者超时。 当没找到match时,可能会返回一个空字符串而不是任何可用的东西。
Akka处理异常的方式简单直接:如果发生异常就先暂停挂起然后交给直属父级Actor去处理。这就把异常封闭在这个Actor的监管链条里。...我们在下面对Actor的开始、终止、重启这三个环节中发生的事件进行描述: 1、开始 当Akka通过Props构建一个Actor后,这个Actor可以立即开始处理消息,进入开始(started)状态...、当一个子级Actor因为异常造成失败中断再重启时用onFailure。...我们可以把厨房Actor作为一个BackoffSupervisor,这样当大厨Actor出现任何异常时厨房Actor可以用一种逐步延时的方式来重启大厨Actor。...msg //把异常消息再摆放到信箱最后 case None => } super.preRestart(reason, message) } override