为客户端设计第三方服务的API

出口

我对Scala相当陌生,我正在开发一个应用程序(库),该应用程序是第三方服务的客户端(我无法修改服务器端,并且使用自定义二进制协议)。我使用Netty进行网络连接。

我想设计一个API,该API应该允许用户:

  • 发送请求到服务器
  • 将请求发送到服务器并异步获取响应
  • 订阅服务器触发的事件(具有多个异步事件处理程序,它们也应该能够发送请求)

我不确定该如何设计。在研究Scala时,我偶然发现了有关Actor模型的大量信息,但是我不确定是否可以在其中应用它,以及如何应用。

我想就应该采取的方式提出一些建议。

斯蒂芬·施韦茨克

可观察的

这看起来像是Obesrvable模式的一个很好的例子。此模式来自.NETReactive Extensions,但也可用于JavaScala该库由Netflix提供,质量非常好。

这种模式具有良好的理论基础---从类别理论上讲,它是迭代器的对偶。但更重要的是,它具有许多实用的想法。特别是它可以很好地处理时间,例如,您可以限制想要获得的事件发生率。

通过观察,您可以平均地处理事件。在.NET中,它看起来很像SQL查询。您可以注册某些事件(“ FROM”),过滤它们(“ WHERE”),最后处理它们(“ SELECT”)。在Scala中,您可以使用标准的monadic API(地图,过滤器,flatMap),当然也可以使用“表达式”。

一个例子看起来像

stackoverflowQuestions.filter(_.tag == "Scala").map(_.subject).throttleLast(1 second).subscribe(println _)

可观测对象消除了基于事件的系统带来的许多问题

  • 处理订阅
  • 处理错误
  • 过滤和预处理事件
  • 缓冲事件

构建API

您的API应该为您拥有的每个事件源提供一个易于理解的内容。对于过程调用,您提供了一个将函数调用映射到可观察对象的函数。该函数将调用远程过程并通过可观察的结果提供结果。

实施细节

将以下依赖项添加到您的build.sbt中:

libraryDependencies +=     "com.netflix.rxjava" % "rxjava-scala" % "0.15.0"

然后,您可以使用以下模式将回调转换为可观察的(鉴于您的远程API具有注册和注销回调的某种方式):

private val callbackFunc : (rx.lang.scala.Observer[String]) => rx.lang.scala.Subscription = { o =>
  val listener = {
    case Value(s) => o.onNext(s)
    case Error(e) => o.onError(o)
  }

  remote.subscribe(listener)

  // Return an interface to cancel the subscription
  new Subscription {
    val unsubscribed = new AtomicBoolean(false)
    def isUnsubscribed: Boolean = unsubscribed.get()

    val asJavaSubscription: rx.Subscription = new rx.Subscription {
      def unsubscribe() {
        remote.unsubscribe(listener)
        unsubscribed.set(true)
      }
    }
  }

如果您有一些特定的问题,请问我,我可以完善答案

额外资源

Martin Odersky等人的课程非常不错在课程中,涵盖了可观察性和其他反应技术。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为客户端设计第三方服务的API

来自分类Dev

如何以编程方式从客户端捕获第三方Web服务xml

来自分类Dev

如何为第三方客户端配置WCF服务终结点

来自分类Dev

如何以编程方式从客户端捕获第三方Web服务xml

来自分类Dev

无法模拟第三方api客户端连接工具

来自分类Dev

使用哪种授权类型来验证第三方客户端的 API 访问权限?

来自分类Dev

在客户端使用带有GWT的第三方库吗?

来自分类Dev

减少来自客户端的第三方异步调用的数量

来自分类Dev

如何在客户端blazor中动态加载第三方javascript?

来自分类Dev

Gatsby何时在客户端js包中包含第三方库?

来自分类Dev

在客户端js上使用第三方的跨源JSON?

来自分类Dev

减少来自客户端的第三方异步调用的数量

来自分类Dev

排序html表格栏的客户端,没有第三方(jquery除外)

来自分类Dev

没有第三方客户端,是否可以连接Windows上的OpenVPN?

来自分类Dev

为连接到第三方的服务选择正确的设计模式

来自分类Dev

如何将第三方XMPP客户端连接到Cisco的Jabber Video?

来自分类Dev

如何使用django的基本访问身份验证将客户端登录到第三方网站

来自分类Dev

第三方服务整合

来自分类Dev

oauth2通过提供的客户端ID /密码通过db获取受信任的第三方客户端的访问令牌

来自分类Dev

如何安全地(通过适当的身份验证)与客户端上的第三方API通信?

来自分类Dev

使用 .NET 调用第三方 API 服务器端并传递变量以在 Javascript 中使用

来自分类Dev

通过VPN连接到EC2 VPC,无需配置路由器或使用第三方客户端

来自分类Dev

Ubuntu 19.10:如何在不安装第三方客户端的情况下将媒体共享到您的电视、游戏机等?

来自分类Dev

如何在没有任何第三方库的情况下在 Android 上制作 RTSP 客户端?

来自分类Dev

Usin AWS IoT为第三方提供服务

来自分类Dev

EasyXDM:从第三方服务下载文件

来自分类Dev

解析集成第三方服务

来自分类Dev

EasyXDM:从第三方服务下载文件

来自分类Dev

AWS IOT到第三方DynamoDB服务

Related 相关文章

  1. 1

    为客户端设计第三方服务的API

  2. 2

    如何以编程方式从客户端捕获第三方Web服务xml

  3. 3

    如何为第三方客户端配置WCF服务终结点

  4. 4

    如何以编程方式从客户端捕获第三方Web服务xml

  5. 5

    无法模拟第三方api客户端连接工具

  6. 6

    使用哪种授权类型来验证第三方客户端的 API 访问权限?

  7. 7

    在客户端使用带有GWT的第三方库吗?

  8. 8

    减少来自客户端的第三方异步调用的数量

  9. 9

    如何在客户端blazor中动态加载第三方javascript?

  10. 10

    Gatsby何时在客户端js包中包含第三方库?

  11. 11

    在客户端js上使用第三方的跨源JSON?

  12. 12

    减少来自客户端的第三方异步调用的数量

  13. 13

    排序html表格栏的客户端,没有第三方(jquery除外)

  14. 14

    没有第三方客户端,是否可以连接Windows上的OpenVPN?

  15. 15

    为连接到第三方的服务选择正确的设计模式

  16. 16

    如何将第三方XMPP客户端连接到Cisco的Jabber Video?

  17. 17

    如何使用django的基本访问身份验证将客户端登录到第三方网站

  18. 18

    第三方服务整合

  19. 19

    oauth2通过提供的客户端ID /密码通过db获取受信任的第三方客户端的访问令牌

  20. 20

    如何安全地(通过适当的身份验证)与客户端上的第三方API通信?

  21. 21

    使用 .NET 调用第三方 API 服务器端并传递变量以在 Javascript 中使用

  22. 22

    通过VPN连接到EC2 VPC,无需配置路由器或使用第三方客户端

  23. 23

    Ubuntu 19.10:如何在不安装第三方客户端的情况下将媒体共享到您的电视、游戏机等?

  24. 24

    如何在没有任何第三方库的情况下在 Android 上制作 RTSP 客户端?

  25. 25

    Usin AWS IoT为第三方提供服务

  26. 26

    EasyXDM:从第三方服务下载文件

  27. 27

    解析集成第三方服务

  28. 28

    EasyXDM:从第三方服务下载文件

  29. 29

    AWS IOT到第三方DynamoDB服务

热门标签

归档