首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Akka 指南 之「消息传递可靠性」

一种最廉价和高效的,而且拥有最低的实现开销,因为它可以发送端或传输机制不保持状态的情况下“即发即弃(fire-and-forget)”的方式完成。...同样的道理,「没有人需要可靠的消息传递」。发送方了解交互是否成功的唯一有意义的方法接收业务的确认消息,这不是 Akka 可以自己完成的(我们既不编写“按我的意思做”的框架,也不希望我们这样做)。...最简单的形式,这需要 识别单个消息将消息与确认关联的方法 一种重试机制,如果不及时确认,将重新发送消息 接收者检测和丢弃重复数据的一种方法 第三个必要的,因为消息也不能保证到达。...此模式本地通信上下文中最有用,因为本地通信上下文中,传递保证在其他方面足以满足应用程序的需求。 请注意,对于「 JVM(本地)消息发送规则」的警告确实适用。...通常是良性的复杂关闭场景,有一种情况很容易发生:看到akka.dispatch.Terminate消息丢失意味着给出了两个终止请求,但只有一个可以成功。

1.7K10

使用Lagom和Java构建反应式微服务系统

DDD鼓励将大型模型打破为有界的上下文。每个有界的上下文定义了适用于特定团队的边界,解决了具体的使用情况,并且包括实现该上下文系统所需的数据模式和物理元素。...Lagom的每个服务调用都有一个请求消息类型和一个响应消息类型。当不使用请求或响应消息时,可以在其位置使用akka.NotUsed。请求和响应消息类型分为两类:严格和流式传输。...Source一种允许异步流式传输和处理消息的Akka流API。 ? 此服务调用具有严格的请求类型和流响应类型。...使用流式传输消息需要使用Akka流。 tick服务调用将返回指定间隔发送消息的源。 Akka流对这样的流有一个有用的构造函数: ? 前两个参数发送消息之前的延迟以及它们应该发送的间隔。...通过为服务描述符定义的每个主题传递不同的消息序列化程序,可以使用不同的序列化格式。 Lagom产生消息的主要来源持久性实体事件。

1.9K50
您找到你想要的搜索结果了吗?
是的
没有找到

Akka 指南 之「第 3 部分: 使用设备 Actors」

通常,消息分为类别或模式。通过识别这些模式,你将发现在它们之间进行选择和实现变得更加容易。第一个示例演示“请求-响应(request-respond)”消息模式。...恰好一次传递:Exactly-once delivery,每条消息只给收件人传递一次;消息既不能丢失,也不能重复。 第一种“至多一次传递 Akka 使用的方式,它是最廉价也是性能最好的方式。...它具有最小的实现开销,因为它可以一种“即发即弃(fire-and-forget)”的方式完成,而不需要将状态保持发送端或传输机制。第二个,“至少一次传递”,需要重试以抵消传输损失。... Actor 系统,我们需要确切含义——即在哪一点上,系统认为消息传递完成: 消息何时在网络上发送? 目标 Actor 的主机何时接收消息? 消息何时被放入目标 Actor 的邮箱?...我们已经看到,Akka 不保证这些消息的传递,并将其留给应用程序提供成功通知。我们的情况下,一旦我们更新了上次的温度记录,例如TemperatureRecorded,我们希望向发送方发送确认。

55130

运用Aggregator模式实现MapReduce

第二部分则结合两个案例来讲解如何在AKKA实现响应式编程。第三部分则是这个主题的扩展,介绍Reactive Manifesto的同时,介绍进行响应式编程更为主流的ReactiveX框架。...AKKA通过Aggregator特性实现了Aggregator模式,可以很好地解决刚才提到的问题。...的操作,用于将偏函数从列表移除。...当我们使用Actor来处理异步消息传递时,当业务渐趋复杂后,我们常常会迷失复杂的消息传递而无法自拔。为了保持清醒的头脑,需要时刻谨记Actor的职责。...事实上,为了实现字数统计的功能,采用AKKA提供的Aggregator确乎有些过度。它更擅长于通过将职责分治与合理运用基于消息的Actor模式完成更为复杂的响应式系统。

1K60

Spark netty RPC 通信原理

Spark netty RPC 通信原理 通信分布式程序的血液和神经,就好比大脑发出的执行需要通过神经和需要才能传递到手脚进行执行。可见好的通信能力分布式系统的重重之中。...综上,Spark2.xx,spark基于netty,参照akka实现了Spark自己的RPC通信框架。 目前spark通信模块主要在core和network-common 模块。...Akka 通信系统架构 Akka 通过消息传递实现并发处理,规避了复杂的thread和私有数据,异步通信,事件响应等处理。 保持数据隔离并绑定到线程。...用户通过构造方法传入的 rpcHandler 负责处理RPC 请求。并且 rpcHandler 负责设置流,这些流可以使用零拷贝IO数据块的形式流式传输。...如果存在未完成的提取或RPC请求但是至少“requestTimeoutMs”上没有通道上的流量,我们认为连接超时。请注意,这是双工流量;如果客户端不断发送但是没有响应,我们将不会超时。

85720

微服务设计 10 大模式和陷阱!

如果当请求超时但是请求服务端已经成功执行了,此时这个交易实际完成的,但是消费方没有拿到确认号,如果重试请求,那么服务方需要一个复杂的机制判断这是否一次重复提交。...此外,Akka也包含了一个断路器实现:Akka CircuitBreaker类。...可达性报告模式(Reach-in Reporting) [ifwtivq9q8.png] 微服务各个服务以及其相应的数据都是包含在一个单独的边界上下文中的,也就是说数据隔离到多个数据库的。...HTTP拉取模式 [130aoekvh0.jpeg] 与数据库拉取模式相比,此种方式不再直接去访问服务的数据库,而是通过HTTP接口去请求服务的数据。...此种方式能够保持服务的边界上下文,但是性能比较慢,而且HTTP请求无法很好的承载大数据。

51250

Akka 指南 之「集群分片」

在这个上下文中,分片意味着具有标识符(称为实体)的 Actor 可以自动分布集群的多个节点上。...你也可以用另一种方式定义它,但它必须唯一的。 当使用分片扩展时,你首先要使用ClusterSharding.start方法注册支持的实体类型,通常是集群每个节点上的系统启动时。...重新平衡过程,协调器不会回答任何有关正在重新平衡的分片位置的请求,即本地缓冲将继续,直到完成切换。...分布式数据模式 vs. 持久化模式 协调器的状态和分片「Remembering Entities」的状态持久的,可以失败幸存。...除此之外,使用一种模式而不使用另一种模式没有主要原因。 集群的所有节点上使用相同的模式很重要,即不可能执行滚动升级来更改此设置。

2.2K61

ElasticMQ 0.7.0:长轮询,使用Akka和Spray的非阻塞实现

实现说明 出于好奇,下面对ElasticMQ如何实现的简短描述,包括核心系统,REST层,Akka数据流使用和长轮询实现。所有的代码都可以GitHub上找到。...如何使用路由中的队列角色(queue actors)来完成HTTP请求? 关于Spray的RequestContext好处,它所做的只是将一个实例传递给你的路由,不需要任何回复。...完全放弃请求或使用某个value完成请求仅仅取决于它的路由。该请求也可以另一个线程完成 - 或者,例如,未来某个线程运行完成时。这正是ElasticMQ所做的。...为了发出响应已完成这个future,HTTP请求也将会适当的响应来完成。然而,这个future几乎可以立即完成(例如正常情况下),比如在10秒之后 - 代码所需的支持没有变化。...当接收到消息的请求到达时,队列没有任何内容产生,而是立即回复(即向发送者actor发送空列表),我们将储存原始请求的引用和发送方actormap

1.5K60

鸟瞰 Java 并发框架

图片来自 http://tutorials.jenkov.com/java-nio/nio-vs-io.html HTTP 线程处理传入请求的连接,并将处理传递给 Executor Pool,当所有任务完成后...因此,非阻塞方式保持线程所带来的好处非常少,而且在此模式处理请求所涉及的成本似乎很高。 通常,对这里讨论采用的例子使用异步非阻塞方法会降低应用程序的性能。 7.1 何时使用?...lmax-disruptor-concurrency 本例HTTP 线程将被阻塞,直到 disruptor 完成任务,并且使用 countdowlatch 将 HTTP 线程与 ExecutorService...这个框架的主要特点没有任何锁的情况下处理线程间通信。 ExecutorService ,生产者和消费者之间的数据将通过 Queue传递,在生产者和消费者之间的数据传输过程涉及到一个锁。...这里需要注意的Akka 和 Disruptor 库值得单独写一篇文章,介绍如何使用它们来实现事件驱动的架构模式。 已在知识星球更新源码解析如下: ? ? ?

96840

更改许可后,Akka 分支 Pekko 进入 Apache 孵化器

事实上,Pekko Akka 项目的一个分支。不久前, Akka 的许可证从 Apache 2 更改为 Business Source License 1.1,Pekko 作为新的分支从中拉出。...我们认为这个分叉对预先存在的 Apache 2 许可证的维护,并要求 Apache 社区这样看待它。”Pekko 项目提案如此写道。...在此之上,Pekko 提供了一套丰富的构建在 Actors 之上的库来解决现代问题,包括: 流:遵循响应式标准的完全双向背压流 HTTP:建立流之上的全流式 HTTP 客户端 / 服务器,还提供高可用性...官方预计孵化过程会很长,“因为我们需要完成大量的代码清理和文档清理。此外,我们需要配置 Apache 构建系统正确构建一个相当复杂的项目(即 akka 核心有需要多节点机器的测试)。”...,能让谷歌云找回自己失去的 10 年

1K20

全链路的数据透传

这里业务方 A 使用透传数据上下文设置透传数据后,协议需要先使用上下文获得透传数据,然后各个协议自己实现透传数据随通信传递通信对端获得透传数据后重新设置回透传上下文中, 这样业务方 B 就可以使用上下文获取到业务方...比如我们目前使用最广泛的 Rpc 框架仍然基于 Http 协议的,那么意味着客户端我们需要将透传数据从上下文取出设置到 request headers ,而在服务端则是从 request headers...但不管怎样, java 要处理异步线程的数据传递的话无非 2 中方式: 基于对象传递 trace 信息为例,我们主线程将 trace 信息封装到一个对象里,然后再起子线程的时候显式将对象传递进去...区分的方法往往请求进行"打标",然后让标识通过数据上下文整条链路中进行透传。不管链路是否有线程切换,包括多少种通信方式。...其次就是对整条链路的流量灰发,灰发一种比较稳妥的部署上线方式,比方说一种灰发规则是可以针对某些特定用户展示最新版本的应用,那么这时我们往往根据请求的类似"user-id"字段来区分用户的。

1.7K10

Akka 指南 之「位置透明」

默认分布 Akka 的所有内容都设计成分布式环境工作:Actor 的所有交互都使用纯消息传递,而所有内容都是异步的。...我们将透明的概念限制几乎没有用于 Akka 远程处理层的 API:它纯粹由配置驱动的。只需根据前面几节概述的原则编写应用程序,然后配置文件中指定 Actor 子树的远程部署。...Client-Server Akka 远程处理一种以对等(peer-to-peer,或者称之为“点对点”)方式连接 Actor 系统的通信模块, Akka 集群的基础。...就连接模式而言,通信系统的角色对称的:没有只接受连接的系统,也没有只启动连接的系统。...这些决策的结果不可能安全地创建具有预定义角色的纯客户机-服务器(client-server)设置(违反假设 2)。对于客户机-服务器设置,最好使用 HTTPAkka I/O。

63420

Akka 指南 之「Actors」

最后一行显示了传递构造函数参数的可能性,而不管它在哪个上下文中使用。...在所有这些方法,你可以选择传递自己的ActorRef。将其作为一种实践,因为这样做将允许接收者 Actor 能够响应你的消息,因为发送者引用与消息一起发送。...Ask: Send-And-Receive-Future ask模式涉及 Actor 和Future,因此它是作为一种使用模式而不是ActorRef上的一种方法提供的: import static akka.pattern.Patterns.ask...通过消息传递初始化 有些情况下,构造函数无法传递 Actor 初始化所需的所有信息,例如在存在循环依赖项的情况下。...警告:此模式应小心使用,并且仅当上述模式均不适用时才应用。其中一个潜在的问题,消息发送到远程 Actor 时可能会丢失。

4K30

都在说微服务,那么微服务的模式和陷阱是什么(一)

有界的上下文可以允许开发者最小的依赖快速轻松地开发,测试和部署。 采用数据驱动迁移模式主要发生在当你从一个单体应用向微服务架构做迁移的时候。...上图中有三个服务从单体应用划分而来,并且还划分独立的三个数据库,这是一个自然演变的过程,因为每个服务和数据库之间都使用了最为关键的限界上下文,然而我们遇到的问题也正是基于这一过程将带领我们进入数据迁移的模式...1.2 功能分割优先,数据迁移最后 此模式主要采用的一种避免的手段,迁移服务的功能为第一,同时也需要注意服务和数据之间的限界上下文。...database pull model HTTP pull model batch pull model event-based push model 前三种模式从服务的数据库拉取数据,所以这个模式就叫...如果你发现需要与太多的服务进行通信完成单个业务请求,那么你的的服务可能粒度过细了。分析服务编排水平,你通常会从细粒度的服务迁移到更粗,如图5-4所示。 ?

1K90

来,带你鸟瞰 Java 的并发框架!

图片来自 http://tutorials.jenkov.com/java-nio/nio-vs-io.html HTTP 线程处理传入请求的连接,并将处理传递给 Executor Pool,当所有任务完成后...因此,非阻塞方式保持线程所带来的好处非常少,而且在此模式处理请求所涉及的成本似乎很高。 通常,对这里讨论采用的例子使用异步非阻塞方法会降低应用程序的性能。 7.1 何时使用?...图片2: https://www.baeldung.com/lmax-disruptor-concurrency 本例HTTP 线程将被阻塞,直到 disruptor 完成任务,并且使用 countdowlatch...这个框架的主要特点没有任何锁的情况下处理线程间通信。 ExecutorService ,生产者和消费者之间的数据将通过 Queue传递,在生产者和消费者之间的数据传输过程涉及到一个锁。...这里需要注意的Akka 和 Disruptor 库值得单独写一篇文章,介绍如何使用它们来实现事件驱动的架构模式。 这篇文章的源代码可以 GitHub 上找到。

61240

鸟瞰 Java 并发框架

图片来自 http://tutorials.jenkov.com/java-nio/nio-vs-io.html HTTP 线程处理传入请求的连接,并将处理传递给 Executor Pool,当所有任务完成后...因此,非阻塞方式保持线程所带来的好处非常少,而且在此模式处理请求所涉及的成本似乎很高。 通常,对这里讨论采用的例子使用异步非阻塞方法会降低应用程序的性能。 7.1 何时使用?...本例HTTP 线程将被阻塞,直到 disruptor 完成任务,并且使用 countdowlatch 将 HTTP 线程与 ExecutorService 的线程同步。...这个框架的主要特点没有任何锁的情况下处理线程间通信。 ExecutorService ,生产者和消费者之间的数据将通过 Queue传递,在生产者和消费者之间的数据传输过程涉及到一个锁。...这里需要注意的Akka 和 Disruptor 库值得单独写一篇文章,介绍如何使用它们来实现事件驱动的架构模式

81230

Akka 指南 之「什么 Actor?」

幕后,Akka 将在一组真正的线程上运行一组 Actor,在这些线程,通常许多 Actor 共享一个线程,随后对一个 Actor 的调用可能最终不同的线程上进行处理。...Akka 与其他一些 Actor 模型实现不同的一个重要特性,当前行为必须始终处理下一条出列的消息,没有扫描邮箱查找下一条匹配的消息。除非重写此行为,否则处理消息失败通常被视为失败。...子 Actor 每个 Actor 都可能一个监督者:如果它为分配子任务创建子 Actor,它将自动对它们进行监督。子列表 Actor 的上下文中维护,并且 Actor 可以访问它。...当 Actor 终止 一旦一个 Actor 终止,即一种不被重启处理的方式失败、自行停止或被其监督者停止,它将释放其资源,将其邮箱的所有剩余邮件排入系统的“死信邮箱(dead letter mailbox...然后 Actor 引用中用系统邮箱替换原 Actor 的邮箱,将所有新消息作为死信重定向到事件流。但是,这是尽最大努力的基础上完成的,因此不要依赖它来构建“有保证的交付”。

86020

ElasticMQ 0.7.0:使用Akka和Spray的长轮询,非阻塞实现

如果队列没有消息,而不是正在完成空响应的请求,ElasticMQ将等待MessageWaitTime秒钟,直到消息到达。...如何使用路由中的队列Actor来完成HTTP请求? 关于Spray的好处,它只是将一个RequestContext实例传递给你的路由,并不期待任何返回。这取决于路由是完全放弃请求还是使用一个值完成。...该请求也可以另一个线程完成; 或者,例如,某个未来完成。这恰好ElasticMQ所采用的。...为了响应完成这个Future,HTTP请求也被完成并具有适当的响应。然而,这个Future几乎可以立即完成(例如正常情况下),或者10秒(或者其他时间)之后 ,支持这些所需要的代码没有变化。...当接收消息的请求到达,并且队列没有任何内容时,我们不是立即回复(即向发送者Actor发送空列表),而是将原始请求的引用和发送方actor存储一个map

1.5K90

Akka 指南 之「分布式数据」

Update消息,你可以传递一个可选的请求上下文,Replicator不关心该上下文,但它包含在回复消息。...这是一种传递上下文信息(例如原始发送者)的方便方法,无需使用ask或维护本地相关数据结构。...但是,没有定义回复消息的顺序,即在上一个示例,你可能会在UpdateSuccess之前收到GetSuccess。 Get消息,你可以通过与上述Update消息相同的方式传递可选的请求上下文。...然后再添加 2 个节点,从 4 个节点读取一个Get请求,正好n4、n5、n6、n7,也就是说,Get请求的响应中看不到n1、n2、n3上的值。...Delete消息,你可以通过与上述Update消息相同的方式传递可选请求上下文。例如,接收和转换DeleteSuccess之后,可以传递和回复原始发件人。

2.5K40
领券