
Scala Akka开发学习
一片
这个作者很懒,什么都没留下…
展开
-
探索万恶的 Slick 3 类型系统 | Prologue
这两天在给Samsara Aquarius的各个Service写分页的时候,设计了一个抽象层,想把一些公共的分页逻辑放在这个trait中,但是被Slick的类型系统折磨了一点时间。。今天粗略看了一下相关的源码,结合这几天遇到的问题,总结一下。因此就把这篇文章作为Prologue吧。。。(Slick的版本为3.1.1)蛋疼的类型参数在Slick里面,分页可以通过drop和take函数实现。q...转载 2019-11-08 14:48:03 · 394 阅读 · 0 评论 -
Akka(21): Stream:实时操控:人为中断-KillSwitch
akka-stream是多线程non-blocking模式的,一般来说,运算任务提交到另外线程后这个线程就会在当前程序控制之外自由运行了。任何时候如果需要终止运行中的数据流就必须采用一种任务柄(handler)方式来控制在其它线程内运行的任务。这个handler可以在提交运算任务时获取。akka-stream提供了KillSwitch trait来支持这项功能:/** * A [[KillS...转载 2018-11-01 15:19:46 · 489 阅读 · 0 评论 -
Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering
akka-stream原则上是一种推式(push-model)的数据流。push-model和pull-model的区别在于它们解决问题倾向性:push模式面向高效的数据流下游(fast-downstream-subscriber),pull model倾向高效的上游(fast-upstream-publisher)。现实中速度同等的上下游并不多见,不匹配的上下游速度最终造成数据丢失。如果下游的s...转载 2018-11-01 14:46:33 · 257 阅读 · 0 评论 -
Akka(19): Stream:组合数据流,组合共用-Graph modular composition
akka-stream的Graph是一种运算方案,它可能代表某种简单的线性数据流图如:Source/Flow/Sink,也可能是由更基础的流图组合而成相对复杂点的某种复合流图,而这个复合流图本身又可以被当作组件来组合更大的Graph。因为Graph只是对数据流运算的描述,所以它是可以被重复利用的。所以我们应该尽量地按照业务流程需要来设计构建Graph。在更高的功能层面上实现Graph的模块化(m...转载 2018-11-01 14:45:33 · 353 阅读 · 0 评论 -
Akka(18): Stream:组合数据流,组件-Graph components
akka-stream的数据流可以由一些组件组合而成。这些组件统称数据流图Graph,它描述了数据流向和处理环节。Source,Flow,Sink是最基础的Graph。用基础Graph又可以组合更复杂的复合Graph。如果一个Graph的所有端口(输入、输出)都是连接的话就是一个闭合流图RunnableGraph,否则就属于·开放流图PartialGraph。一个完整的(可运算的)数据流就是一个R...转载 2018-11-01 14:44:34 · 500 阅读 · 0 评论 -
Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定。一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回调地狱(callback hell)”,即所谓的“goto-hell”:程序控制跳来跳去很难跟踪,特别是一些变量如果在回调函数中更改后产生不可预料的结果。数据流(stream)是一种解决问题的有效编...转载 2018-11-01 14:42:49 · 767 阅读 · 0 评论 -
akka-stream与actor系统集成以及如何处理随之而来的背压问题
一共存在四个api:Source.actorRef,返回actorRef,该actorRef接收到的消息,将被下游消费者所消费。Sink.actorRef,接收actorRef,做为数据流下游消费节点。Source.actorPublisher,返回actorRef,使用于reactive stream的Publisher。Sink.actorSubscriber,使用于reactive...转载 2018-11-01 14:27:17 · 816 阅读 · 0 评论 -
依赖注入
依赖注入是一种广泛使用的设计模式,可以帮助你分离你的组件,使代码更模块化。Play 是一个提供了Scala和Java两套API的Full Stack WEB应用框架,它从2.4版本开始推荐使用 Guice来作DI(依赖注入)。 而从2.5版本开始,路由定义从之前默认使用Scala object改为了使用class + DI的方式。动机依赖注入的目的:可以轻松地将不同的实现方式绑定到相同的组件。这个...转载 2018-04-22 07:52:15 · 353 阅读 · 0 评论 -
Overcoming Type Erasure in matching 1
Since Scala runs on the JVM (it also runs on .NET but we this tip is aimed at Scala on the JVM) much of the type information that is available at compile-time is lost during runtime. This means certai转载 2017-11-04 06:39:32 · 395 阅读 · 0 评论 -
Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub
在现实中我们会经常遇到这样的场景:有一个固定的数据源Source,我们希望按照程序运行状态来接驳任意数量的下游接收方subscriber、又或者我需要在程序运行时(runtime)把多个数据流向某个固定的数据流终端Sink推送。这就涉及到动态连接合并型Merge或扩散型Broadcast的数据流连接点junction。从akka-stream的技术文档得知:一对多,多对一或多对多类型的复杂数据流组...转载 2018-11-01 15:20:18 · 374 阅读 · 0 评论 -
Akka(23): Stream:自定义流构件功能-Custom defined stream processing stages
从总体上看:akka-stream是由数据源头Source,流通节点Flow和数据流终点Sink三个框架性的流构件(stream components)组成的。这其中:Source和Sink是stream的两个独立端点,而Flow处于stream Source和Sink中间可能由多个通道式的节点组成,每个节点代表某些数据流元素转化处理功能,它们的链接顺序则可能代表整体作业的流程。一个完整的数据流(...转载 2018-11-01 15:21:07 · 426 阅读 · 0 评论 -
Guice 快速入门
Guice是谷歌推出的一个轻量级依赖注入框架,帮助我们解决Java项目中的依赖注入问题。如果使用过Spring的话,会了解到依赖注入是个非常方便的功能。不过假如只想在项目中使用依赖注入,那么引入Spring未免大材小用了。这时候我们可以考虑使用Guice。本文参考了Guice官方文档,详细信息可以直接查看Guice文档。基本使用引入依赖如果使用Maven的话,添加下面的依赖项。&...转载 2019-08-22 14:09:50 · 1501 阅读 · 0 评论 -
[翻译]akka in action之akka-stream(4 生产者与消费者之间的调解)
生产者与消费者之间的调解下一个示例将涉及将事件广播到消费服务。到目前为止,我们已经将日志事件写入磁盘——一个含有所有事件的日志文件,以及警告、错误和关键错误的几个文件。在日志流处理器的最终版本中, 事件将被发送到存档服务、通知服务和度量服务。日志流处理器必须平衡供应和需求,以确保当其中一个服务应用回压时,这不会减慢日志事件的生产者。在下一节中,我们将讨论如何使用缓冲区来实现...转载 2019-07-19 15:11:37 · 361 阅读 · 0 评论 -
[翻译]akka in action之akka-stream(3 使用Graph DSL实现扇入扇出)
3 使用Graph DSL实现扇入扇出到目前为止,我们只研究了一个输入和一个输出的线性处理。Akka-stream提供了用于描述扇入和扇出的图DSL(领域专用语言),能够定义有大量输入和输出的图。图形 DSL 差不多是一种图解 ASCII-许多情况下, 你可以将图形的白板图转换为 DSL。有许多扇入和扇出GraphStages,可用于创建各种图形,例如Source、FLow、S...转载 2019-07-19 15:10:04 · 549 阅读 · 0 评论 -
[翻译]akka in action之akka-stream(2 流式HTTP)
2 流式HTTP日志流处理器(log-stream processor )将以HTTP服务运行。让我们来看看这意味着什么。Akka-http 使用 akka-stream,所以从基于文件的APP到HTTP服务并不需要很多粘合代码。Akka-http 是一个非常好的例子,一个包含akka-stream的库。首先,我们要在工程中添加更多的依赖:这一次我们将构建Logs...转载 2019-07-19 15:08:57 · 636 阅读 · 0 评论 -
[翻译]akka in action之akka-stream (1 基本流处理)
1 基本流处理让我们首先看看使用akka-stream处理流的真正含义。图1展示了在某个处理节点上,元素是一个个如何被处理的。一次处理一个元素是防止内存溢出的关键。还可以看到,有限内存可用于处理链上的某些位置。图1与actor的相似性是显而易见的。如图1所示,不同点在,生产者和消费者之间的信号,该信号描述了在有限内存中可以处理什么。如果直接使用actor来实现,这部分你要自己来实现。图...转载 2019-07-19 15:05:52 · 1075 阅读 · 0 评论 -
Akka(24): Stream:从外部系统控制数据流-control live stream from external system
在数据流应用的现实场景中常常会遇到与外界系统对接的需求。这些外部系统可能是Actor系统又或者是一些其它类型的系统。与这些外界系统对接的意思是在另一个线程中运行的数据流可以接收外部系统推送的事件及做出行为改变的响应。如果一个外界系统需要控制一个运行中数据流的功能环节GraphStage,首先必须在这个GraphStage内部构建一个控制函数,这样才能接触并更改GraphStage的内部状态。外...转载 2018-11-01 15:21:44 · 414 阅读 · 0 评论 -
Pattern matching around type erasure
You may have encountered this warning: "scala non-variable type argument in type pattern is unchecked since it is eliminated by erasure". If you google for it, you quickly find several decent Stack Ov转载 2017-11-04 02:02:27 · 313 阅读 · 0 评论 -
Lightweight type erasure matching
Scala’s pattern matching is much touted as a killer feature, and generally easy and convenient to use, but due to type erasure one needs to be somewhat careful with typed collections. Check out th转载 2017-10-31 04:45:49 · 316 阅读 · 0 评论 -
浅谈Scala 2.8的包对象(package object)
Scala 2.8提供包对象(package object)的新特性。什么是包对象呢?按我的理解,根据Scala“一切皆对象”设计哲学,包(package)也是一种对象。既然是对象,那么就应该有属性和方法,也可以在包对象内声明某个类型的别名。举个例 package com{ package object ggd543{ type HashMap[A,B] = scala.coll转载 2017-10-28 02:35:31 · 350 阅读 · 0 评论 -
Akka学习笔记(七):配置
Akka学习笔记(七):配置使用Akka可以不用任何配置,Akka提供了明智的默认配置。为了适应特别的运行环境,修改默认行为,你可能需要修改:log level and logger backendenable remoting消息系列化路由设置调度器调优Akka使用Typesafe Config Library,纯java实现的配置库。之前博客有介绍过here从哪转载 2016-01-14 08:49:52 · 832 阅读 · 0 评论 -
Akka笔记之配置及调度
正如前几篇文章中所看到的,我们可以通过ActorSystem的actorOf方法来创建一个Actor。其实ActorSystem还可以做许多事情。本篇中我们来看下如何用它来进行配置及调度。我们先看下ActorSystem里的方法的一个子集。1. 配置管理还记得前面我们用来配置日志级别的那个application.conf文件吗?它就好比Java程序里的那些.prop转载 2016-01-14 08:32:05 · 3808 阅读 · 0 评论 -
Akka cluster介绍
akka cluster介绍Akka Cluster提供了一个可容错、去中心化的,基于点对点的集群成员服务(membership service),解决了单点故障和单点瓶颈问题。名词### node cluster的逻辑成员。 在一个物理机器上可能存在多个node。以 hostname:port:uid 的元组定义。在本文种,任何地方提到节点其含义等同于node。转载 2016-01-14 07:08:03 · 3746 阅读 · 0 评论 -
Scala基础教程--2 基本语法
1、常量和变量val声明出来的为常量,不能再次赋值;可以省略类型,scala会自动推导。var声明出来的为变量,可以再次赋值;可以省略类型,scala会自动推导。var a = "xxx"; 等同于 var a : String = "xxx";a = "String 2";val b = 2;b = 3; // 会出错声明多个变量:val a, b = "xxx"转载 2015-12-09 02:19:01 · 495 阅读 · 0 评论 -
让并发和容错更容易:Akka示例教程
摘要:Akka用Scala语言写成,为开发高并发、分布式和容错式应用提供了便利,对开发者隐藏了很大程度的复杂性。把Akka用好肯定需要了解比这个教程更多的内容,但是希望这里的介绍和示例能够引起你的注意并继续了解Akka。写并发程序很难。程序员不得不处理线程、锁和竞态条件等等,这个过程很容易出错,而且会导致程序代码难以阅读、测试和维护。所以,很多人不倾向于使用多线程编程。取而转载 2016-01-09 10:02:55 · 1795 阅读 · 0 评论 -
IntelliJ IDEA 的 20 个代码自动完成的特性
在这篇文章中,我想向您展示 IntelliJ IDEA 中最棒的 20 个代码自动完成的特性,可让 Java 编码变得更加高效。对任何集成开发环境来说,代码的自动完成都是最最重要的一项功能,它根据你输入的内容进行预判并帮你自动完成你想输入的代码,有时候甚至都不知道自己想要输入什么,例如一些类名、成员、方法或者是其他方面的内容。IntelliJ IDEA 中的代码自动完成的功能之所以能让我如转载 2015-12-05 02:34:24 · 1748 阅读 · 0 评论 -
Intellij IDEA使用入门
前言 对于java的开发工具笔者一直使用的是Eclipse居多,Eclipse是基于插件开发的功能十分的 全面.笔者也觉得Eclipse是一款十分强大的开源工具.不过最近心血来潮十分想试试其他开发工 具。Intellij IDEA同样是一款很好的开发工具,对于其和Eclipse到底谁更转载 2015-12-05 02:56:11 · 9958 阅读 · 0 评论 -
Scala基础教程--3控制结构与函数
在java语言中,表达式表示值,语句表示执行动作。 例如:表达式1+1表示值;thread.start()表示执行动作。所有语法结构都有值,那怕是不存在用Unit类型.if/else语句有值,为跟在if或else之后的表达式的值。例:val s = if(x > 0) 1 else 0; 等同于var s:Int = 0; if (x > 0) s = 1 else s =转载 2015-12-09 03:24:13 · 444 阅读 · 0 评论 -
Akka的Cluster源码分析
1.概述Akka这样一个scala世界里的明星,给我们提供了各种各样吸引人的功能和特性,尤其在分布式、高并发领域。但就像任何其他优秀的框架,它的实现也必然会有其复杂性,在Roland Kuhn(Akka Tech Lead)的带领下,Akka的实现原理吸收了各个领域内成熟、领先的理论。尤其是Akka里cluster的实现,更是体现了非常多的优秀理论和实战经验。为了更方便大家在实际使用中碰到问题转载 2016-01-15 06:07:21 · 1102 阅读 · 0 评论 -
Akka Cluster原理与应用
Akka集群原理 Akka集群支持去中心化的基于P2P的集群服务,没有单点故障(SPOF)问题,它主要是通过Gossip协议来实现。对于集群成员的状态,Akka提供了一种故障检测机制,能够自动发现出现故障而离开集群的成员节点,通过事件驱动的方式,将状态传播到整个集群的其它成员节点。状态转移与故障检测Akka内部为集群成员定义了一组有限状态(6种状态),并给出了一个状态转移矩转载 2016-01-15 06:11:00 · 875 阅读 · 0 评论 -
Scala 的 yield 例子 (for 循环和 yield 的例子)
我看了《Programming in Scala》一书,仍然对 Scala yield 关键字的理解不甚清楚。起初我以为 Scala yield 的与 Ruby 的 yield 是一样,Ruby 中 yield 是被传入代码块的占位符。Scala 中的 yield 关键字好像总是在 for 循环中用的. 下面一些例子可以帮助你更好的理解 yield 关键字。下面是摘自 《Programming转载 2017-03-04 06:05:55 · 477 阅读 · 0 评论 -
Scala--样例类(case)详解
概述: case类在模式匹配和actor中经常使用到,当一个类被定义成为case类后,Scala会自动帮你创建一个伴生对象并帮你实现了一系列方法且带来了不少好处,如下: 1.实现了apply方法,意味着你不需要使用new关键字就能创建该类对象 scala> case class People(name:String,age:Int) defined class People scala> va转载 2016-05-02 02:24:05 · 1331 阅读 · 1 评论 -
scala implicit 隐式转换
我们经常在scala 源码里上看到类似implicit这个关键字。一开始不太理解,后来看了看,发现implicit这个隐式转换是支撑scala的易用、容错以及灵活语法的基础。我们经常使用的一些集合方法里面就用到了implicit,比如:[java] view plain copydef flatMap[B, That](f:转载 2016-05-01 23:44:02 · 920 阅读 · 0 评论 -
IDEA如何打包可运行jar的一个问题。
背景:有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包;或者某些项目不是WEB应用,纯粹是后台应用,发布时,也需要打成可运行的JAR包。并且,如果依赖第三方jar时,又不希望第三方jar也打入最终的可运行jar包,并且还希望,组织下目录结构(如把第三方jar文件,放到最终可运行jar包的并行目录lib下) 开发环境OS: Windows 8.1转载 2016-04-30 02:42:29 · 1811 阅读 · 1 评论 -
ScalaTest测试框架
ScalaTest 是一个开源测试框架,旨在令测试更加高效。其开发者是Bill Venners(Artima主编)。Bill Venners这样描述ScalaTest:ScalaTest是比JUnit和TestNG更加高阶的测试编写工具,这个Scala应用在JVM上运行,可以测试Scala以及Java代码。除了与JUnit和TestNG的深层集成外,还支持Ant任务,与maven集成,转载 2016-04-01 02:49:35 · 8197 阅读 · 0 评论 -
scala隐式参数(implicit)
SBinary 和 Scalacheck的一部分库,广泛使用了隐式参数。让人联想起了Haskell(一种函数式编程语言)的编程风格,我真心的希望在Scala中这种编程风格更加广泛。这是一种非常有用的技术。作为开始如下多重入参(柯里化)的例子:scala -> def foo(x: Int)(y: Int) = x+yfoo: (x: Int)(y: Int) Int转载 2016-03-30 02:30:19 · 474 阅读 · 0 评论 -
Akka TestKit测试包的使用
TestKit,测试类必须继承几个接口:class SendingActor01Test extends TestKit(ActorSystem("testsystem")) //TestKit创建testsystem用于测试 with WordSpecLike //可以用must,in等语句描述测试方法 with MustMatchers //must描述assertion,比如"h转载 2016-01-15 06:58:36 · 1127 阅读 · 0 评论 -
Akka框架基本要点介绍
Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable)、弹性的(Resilient)、快速响应的(Responsive)应用程序的平台。本文基本上是基于Akka的官方文档(版本是2.3.12),通过自己的理解,来阐述Akka提供的一些组件或概念,另外总结了Akka的一些使用场景。Actor维基百科这样定义Actor模型:在计算科学领域,Actor模型转载 2016-01-15 06:12:41 · 812 阅读 · 0 评论 -
Scala基础教程--4 Map和Tuple
Map构造Map不可变:val map = Map("sa" -> 1, "s" -> 2) map("sa") = 3 // errorval emptyMap = new scala.collection.immutable.HashMap[String, Int]可变:val map2 = scala.collection.mutable.Map("sa" -> 2)转载 2015-12-09 09:13:31 · 490 阅读 · 0 评论