如何在 F# 中的集群配置中创建参与者

2024-01-19

我正在创建一个示例Akka.Cluster具有三个节点 A、B 和 C,其中 A 是灯塔。到目前为止,从日志来看,当没有参与者或参与者是本地的(使用创建的)时,集群工作正常spawn and spawnOpt)。我想从 B 创建一个 actor 并从 C 访问它。

With

let _ = spawne system "r-actor" <@ actorOf (fun msg -> printfn "Received: %s" msg) @> []

I get

2016-08-31 01:59:00.1185|INFO|Akka.Actor.EmptyLocalActorRef|Message String from akka://calculatorSystem/deadLetters to akka://calculatorSystem/user/r-actor was not delivered. 1 dead letters encountered.

Using

let r = FromConfig.Instance :> RouterConfig |> SpawnOption.Router
let _ = spawne system "r-actor" <@ actorOf (fun msg -> printfn "Received: %s" msg) @> [r]

抛出异常

未处理的类型异常Akka.Configuration.ConfigurationException发生在Akka.dll中
附加信息:Configuration problem while creating [akka://calculatorSystem/user/r-actor] with router dispatcher [akka.actor.default-dispatcher] and mailbox and routee dispatcher [akka.actor.default-dispatcher] and mailbox [].

节点C上的测试函数是

let rec calculate content =
  printfn "Processing %s" content
  let actor = select "/user/r-actor" system
  actor <! content
  let text = Console.ReadLine()
  if text <> "quit" then
    calculate text
calculate "sample1"

HOCON(节点 B)

    akka {
      actor {
        provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
        serializers {
          wire = "Akka.Serialization.WireSerializer, Akka.Serialization.Wire"
        }
        serialization-bindings {
          "System.Object" = wire
        }
        deployment {
          /user/add {
            router = round-robin-pool
            nr-of-instances = 10
            cluster {
              enabled = on
              max-nr-of-instances-per-node = 10
              allow-local-routees = off
            }
          }
          /user/r-actor {
            router = round-robin-pool
            nr-of-instances = 10
            cluster {
              enabled = on
              max-nr-of-instances-per-node = 10
              allow-local-routees = off
            }
          }
        }
      }
      remote {
        log-remote-lifecycle-events = DEBUG
        log-received-messages = on
        helios.tcp {
          transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
          applied-adapters = []
          transport-protocol = tcp
          hostname = "127.0.0.1"
          port = 0
        }
      }
      loggers = ["Akka.Logger.NLog.NLogLogger,Akka.Logger.NLog"]
      cluster {
        seed-nodes = [
          "akka.tcp://[email protected] /cdn-cgi/l/email-protection:7001"
        ]
        roles = ["add-service"]
        auto-down-unreachable-after = 10s
      }
    }

如何创建一个可以被集群中另一个节点调用的参与者?


定义路由器配置时,不要使用/user前缀 - 它是自动添加的。

此外,如果您想选择驻留在另一个节点上的参与者,则需要使用完整的参与者路径(带有节点地址) - 这是因为事实上,可能有不同的参与者居住在具有相同路径的不同节点上。你必须精确。

通常,在编译时您不会知道节点的地址。有两种方法可以提取:

1.从集群状态获取地址

这更容易,但您失去了对加入/离开节点做出反应的能力。你被迫每次都检查它,这很慢。本示例使用ActorSelection.ResolveOne检索实际的IActorRef实例。

async {
    let members = Cluster.Get(system).State.Members
    let actorRefs =
        members 
        |> Seq.filter (fun m -> m.Roles.Contains("expected")) // use roles to filter out nodes that shouldn't be checked
        |> Seq.map (fun m -> 
            let selection = select (m.Address.ToString() + "user/r-actor") system
            let actorRef = selection.ResolveOne(timeout) |> Async.AwaitTask)
        |> Async.Parallel }

2. 订阅集群事件并对加入/离开节点做出反应

在这里,您可以在节点加入/离开时对其做出反应。它还使用Identify/ActorIdentity接收实际的IActorRef,这是更快的选项。

let aref =  
    spawn system "listener"
    <| fun mailbox ->
        let cluster = Cluster.Get (mailbox.Context.System)
        cluster.Subscribe (mailbox.Self, [| typeof<ClusterEvent.IMemberEvent> |])
        mailbox.Defer <| fun () -> cluster.Unsubscribe (mailbox.Self)
        let rec loop () = 
            actor {
                let! (msg: obj) = mailbox.Receive ()
                match msg with
                | :? ClusterEvent.MemberUp as up -> 
                    // new node joined the cluster
                    let selection = select (up.Member.Address.ToString() + "user/r-actor") mailbox
                    selection <! Identify(null) // request actor under selection to identify itself
                | :? ActorIdentity as id when id.Subject <> null ->
                    // actor has identified itself
                    id.Subject <! "hello"
                | :? ClusterEvent.MemberRemoved as rem -> 
                    //  node leaved the cluster, invalidate all actors from that node
                | _ -> ()
                return! loop () }
        loop ()

如果有疑问,我写了一个博客文章 http://bartoszsypytkowski.com/how-create-an-akka-net-cluster-in-f/关于从 F# 创建 Akka.NET 集群。也许你会发现它很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 F# 中的集群配置中创建参与者 的相关文章

  • 如何在 Akka.NET 中使用 TestKit

    我正在尝试测试我的 Akka NET Actor 但在使用 TestKit 和理解它的工作原理时遇到了一些问题 由于 Akka NET 中还没有关于单元测试的官方文档 我已经探索了 Akka NET 存储库中的示例代码 但那里使用的示例对我
  • 使用 F# 的爱因斯坦之谜解决方案 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在找爱因斯坦之谜 http en
  • 在 F# 中设置 ViewBag 动态对象的属性

    我在 C 中有这个操作方法 public ActionResult Index ViewBag Message Hello return View 这个视图 Index cshtml h2 ViewBag Message h2 这会在页面上
  • 在 F# 中的 Choice 之上构建 Either(或 Result)

    我根据 Scott Wlaschin 中的信息构建了一个成功 失败的 monadblog http fsharpforfunandprofit com posts computation expressions wrapper types
  • F# 中使用抽象类还是接口?

    从 C 背景开始摸索 F 在 C 中 决定何时使用接口和何时使用抽象类有明显的区别 在 F 中 我发现两者几乎合而为一 我知道 就 CLR 而言 F 中的做法与 C 中的做法相同 但是在 F 中编程时使用的 最佳实践 是什么 我应该完全避免
  • FParsec:如何组合解析器以便它们以任意顺序匹配

    任务是找到特定的键值对并解析它们 这些对可以按任何顺序出现 我的部分工作尝试 open FParsec type Parser lt a gt Parser lt a unit gt type Status Running Done typ
  • 是 F# 映射上的迭代还是集合中序遍历?

    AFAIK F Map 和 set 被实现为红黑树 所以我猜这些的迭代将是有序遍历 我做了一些测试 迭代结果总是排序的 但我想确定一下 是按顺序遍历吗 MSDN 上的文档非常适合解决这个问题 例如 返回值Set toSeq http msd
  • 何时在 F# 中使用区分联合与记录类型

    在继续讨论复杂的示例之前 我试图先弄清楚 F 的基础知识 我正在学习的材料介绍了区分联合和记录类型 我已经审阅了两者的材料 但我仍然不清楚为什么我们要使用其中之一而不是另一个 我创建的大多数玩具示例似乎都可以在两者中实现 记录似乎非常接近我
  • 在 IEnumerable 上使用 Seq 函数 [重复]

    这个问题在这里已经有答案了 我正在尝试在 IEnumerable 上应用 Seq 函数 更具体地说 它是System Windows Forms HtmlElementCollection它实现了ICollection and IEnume
  • F# 中类型约束的顺序

    这适用于 F 4 0 type Something lt a b when b gt seq lt b gt gt 这不会 type Something lt b when b gt seq lt b gt a gt 类型名称中出现意外的符
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • 从 C# 调用高阶 F# 函数

    给定 F 高阶函数 在参数中采用函数 let ApplyOn2 f int gt int f 2 和 C 函数 public static int Increment int a return a 我怎么打电话ApplyOn2 with I
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是

随机推荐

  • 访问属性“H”的权限被拒绝

    我编写了下面的代码来使用java脚本捕获网页的整个屏幕截图 我在用着 火狐版本 49 0 1 铬版本 54 0 2840 59 m硒版本 3 0 0 OS Win10 64位Java 1 8 import java io File impo
  • 使用 Tor + Privoxy 抓取谷歌购物结果:如何避免被阻止?

    我已经安装了Tor Privoxy在我的服务器上 它们工作正常 已测试 但现在当我尝试使用urllib2 python 当然 使用代理来抓取谷歌购物结果 我总是被谷歌阻止 有时是503错误 有时是403错误 那么任何人有任何解决方案可以帮助
  • 使用socket.io/node.js在网页上显示流式twitter

    我正在尝试使用 node js socket io 和 twit 构建 Twitter 流式 Web 应用程序 var express require express app express http require http server
  • 用 X"" 测试空字符串[重复]

    这个问题在这里已经有答案了 我知道我可以在 Bash 中测试空字符串 z像这样 if z myvar then do stuff fi 但我看到很多代码都是这样写的 if X X myvar then do stuff fi 这种方法更便携
  • VS2008如何从Web Developer更改为C# Developer设置

    我刚刚重新安装了 vs2008 第一次运行时不小心选择了 Web Developer 而不是 C Developer 现在我习惯的所有键绑定都是错误的 如何将其更改为 C Developer 我尝试了 devenv resetsetting
  • URL Selenium 超出最大重试次数 [重复]

    这个问题在这里已经有答案了 因此 我希望遍历 URL 数组并打开不同的 URL 以使用 Selenium 进行网页抓取 问题是 一旦我点击第二个 browser get url 我就会收到 URL 超出最大重试次数 和 无法建立连接 因为目
  • Symfony2,原则 2:getResult 对象

    posts em gt find Application BlogBundle Entity Post 1 print r posts 为什么我得到了 Barii BlogBundle Entity Post Object id Barii
  • 欧拉计划#29

    嗯 解决了这个问题之后通过天真 的STL集 我正在阅读论坛条目 在那里我找到了这个条目 include
  • Java Swing JToolBar

    我创造了JToolBar Java 摇摆 我在框架上设置了一个背景图像 其中包含JToolBar 我想要我的JToolBar是透明的 以便保持在框架上的图像应该是可见的 我在用setOpaque false 但它对我的工具栏没有任何影响 以
  • 重置子元素的不透明度 - Maple 浏览器(三星电视应用程序)

    我在创建具有子元素的透明元素时遇到问题 使用此代码 子元素从父元素获取不透明度值 我需要将子元素的不透明度重置 设置为任意值 参考浏览器是Maple Browser for a Samsung TV Application video ca
  • 如何在material-ui中将焦点设置在MenuItem上

    我正在尝试以编程方式将焦点设置在 激活 material ui 中菜单组件内的菜单项之一上 我可以通过按 Tab 键手动执行此操作 但我需要以编程方式执行此操作以响应按键事件 menu menu
  • 如何在 Telerik ASP .NET MVC 网格上将布尔值从 true/false 转换为 yes/no

    我希望能够更改 ASP NET MVC 中不可编辑的 Telerik AJAX 网格上不可编辑列的显示值 有问题的列是一个布尔值 因此显示转换将为 Yes true 和 No False 我做了一些实验 发现这有效 不确定它是否会保留在可编
  • 从 Schittkowski DAE 测试套件中求解 PENDULUM2?

    我只是试图解决 Schittkowski DAE 测试套件中的 DAE 问题之一 http klaus schittkowski de mc dae htm http klaus schittkowski de mc dae htm 但没有
  • 如何以相同的方式修改或替换字典中的每个值?

    给定一个像这样的字典myDict ten 10 fourteen 14 six 6 如何修改每个值 例如 我想将每个值除以二 这样myDict变成 ten 5 fourteen 7 six 3 就位 而不是创建新字典 迭代键和值 for k
  • 检查 URL 的内容:是文件还是网页?

    我有一个应用程序 需要根据内容采取不同的操作URL 如果内容是文件 我需要下载它 但是 如果内容是网页 我需要打开它 据我所知 有两种 URL 类型 直接链接 例如 https dl ssl google com android repos
  • WPF 应用程序的多线程策略需要建议

    我正在构建一个单窗口 WPF 应用程序 窗口中是一个列表项 当然 它们保存在数据库中 我需要定期启动一个后台任务 从 Atom feed 更新数据库 当每个新项目添加到数据库中时 UI 中的列表也必须更新以反映这一点 我不希望这个后台任务减
  • 滑块输入延迟

    有没有办法使sliderInput http shiny rstudio com reference shiny latest sliderInput html等待几秒钟 然后它会更改其对应的input 多变的 我有一个栏正在控制需要根据值
  • 使用 Mac 应用程序部署 Qt 框架以及 otool 的使用

    我在使用我的 Mac 应用程序部署 Qt 框架时遇到问题 我希望有人能知道为什么当我在干净的 Mac 即不是开发人员 Mac 上运行该应用程序时会出现此错误 操作系统 10 7 2 并使用 XCode 错误消息 Library not lo
  • 如何使用列表(或元组)作为字符串格式化值

    假设这个变量 s Python rocks x s s s 0 s 1 现在我想替换更长的列表 并分别添加所有列表值 例如 s 0 s 1 s n 似乎不正确 引用自文档 给定格式 值 如果格式 需要一个参数 值可以 是单个非元组对象 4
  • 如何在 F# 中的集群配置中创建参与者

    我正在创建一个示例Akka Cluster具有三个节点 A B 和 C 其中 A 是灯塔 到目前为止 从日志来看 当没有参与者或参与者是本地的 使用创建的 时 集群工作正常spawn and spawnOpt 我想从 B 创建一个 acto