当前位置:K88软件开发文章中心编程语言SQLscala → 文章内容

Searchbird

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-19 4:45:26

由 Shaodengdeng 创建, 最后一次修改 2016-08-12 Searchbird我们要使用 Scala 和先前介绍的 Finagle 框架构建一个简单的分布式搜索引擎。设计目标:大图景从广义上讲,我们的设计目标包括 抽象 (abstraction:在不知道其内部的所有细节的前提下,利用该系统功能的能力)、 模块化 (modularity:把系统分解为小而简单的片段,从而更容易被理解和/或被更换的能力)和 扩展性 (scalability:用简单直接的方法给系统扩容的能力)。我们要描述的系统有三个部分: (1) 客户端 发出请求,(2) 服务端 接收请求并应答,和(3) 传送 机制来这些通信包装起来。通常情况下,客户端和服务器位于不同的机器上,通过网络上的一个特定的端口进行通信,但在这个例子中,它们将运行在同一台机器上(而且仍然使用端口进行通信) 。在我们的例子中,客户端和服务器将用 Scala 编写,传送协议将使用 Thrift 处理。本教程的主要目的是展示一个简单的具有良好可扩展性的服务器和客户端。探索默认的引导程序项目首先,使用 scala-bootstrapper 创建一个骨架项目( “ Searchbird ” )。这将创建一个简单的基于 Finagle 和 key-value 内存存储的 Scala 服务。我们将扩展这个工程以支持搜索值,并进而支持多进程多个内存存储的搜索。$ mkdir searchbird ; cd searchbird$ scala-bootstrapper searchbirdwriting build.sbtwriting config/development.scalawriting config/production.scalawriting config/staging.scalawriting config/test.scalawriting consolewriting Gemfilewriting project/plugins.sbtwriting README.mdwriting sbtwriting src/main/scala/com/twitter/searchbird/SearchbirdConsoleClient.scalawriting src/main/scala/com/twitter/searchbird/SearchbirdServiceImpl.scalawriting src/main/scala/com/twitter/searchbird/config/SearchbirdServiceConfig.scalawriting src/main/scala/com/twitter/searchbird/Main.scalawriting src/main/thrift/searchbird.thriftwriting src/scripts/searchbird.shwriting src/scripts/config.shwriting src/scripts/devel.shwriting src/scripts/server.shwriting src/scripts/service.shwriting src/test/scala/com/twitter/searchbird/AbstractSpec.scalawriting src/test/scala/com/twitter/searchbird/SearchbirdServiceSpec.scalawriting TUTORIAL.md首先,来看下 scala-bootstrapper 为我们创建的默认项目。这是一个模板。虽然最终将替换它的大部分内容,不过作为支架它还是很方便的。它定义了一个简单(但完整)的 key-value 存储,并包含了配置、thrift 接口、统计输出和日志记录。在我们看代码之前,先运行一个客户端和服务器,看看它是如何工作的。这里是我们构建的:这里是我们的服务输出的接口。由于 Searchbird 服务是一个 Thrift 服务(和我们大部分服务一样),因而其外部接口使用 Thrift IDL(“接口描述语言”)定义。src/main/thrift/searchbird.thriftservice SearchbirdService { string get(1: string key) throws(1: SearchbirdException ex) void put(1: string key, 2: string value)}这是非常直观的:我们的服务 SearchbirdService 输出两个 RPC 方法 get 和 put 。他们组成了一个到 key-value 存储的简单接口。现在,让我们运行默认的服务,启动客户端连接到这个服务,并通过这个接口来探索他们。打开两个窗口,一个用于服务器,一个用于客户端。在第一个窗口中,用交互模式启动 SBT(在命令行中运行 ./sbt [1]),然后构建和运行项目内 SBT。这会运行 Main.scala 定义的 主 进程。$ ./sbt...> compile> run -f config/development.scala...[info] Running com.twitter.searchbird.Main -f config/development.scala配置文件 (development.scala) 实例化一个新的服务,并监听 9999 端口。客户端可以连接到 9999 端口使用此服务。现在,我们将使用 控制台 shell脚本初始化和运行一个客户端实例,即 SearchbirdConsoleClient 实例 (SearchbirdConsoleClient.scala) 。在另一个窗口中运行此脚本:$ ./console 127.0.0.1 9999[info] Running com.twitter.searchbird.SearchbirdConsoleClient 127.0.0.1 9999'client' is bound to your thrift client.finagle-client> 客户端对象 client 现在连接到本地计算机上的 9999 端口,并可以跟服务交互了。接下来我们发送一些请求:scala> client.put("marius", "Marius Eriksen")res0: ...scala> client.put("stevej", "Steve Jenson")res1: ...scala> client.get("marius")res2: com.twitter.util.Future[String] = ...scala> client.get("marius").get()res3: String = Marius Eriksen(第二个 get() 调用解析 client.get() 返回的 Future 类型值,阻塞直到该值准备好。)该服务器还输出运行统计(配置文件中指定这些信息在 9900 端口)。这不仅方便对各个服务器进行检查,也利于聚集全局的服务统计(以机器可读的 JSON 接口)。打开第三个窗口来查看这些统计:$ curl localhost:9900/stats.txtcounters: Searchbird/connects: 1 Searchbird/received_bytes: 264 Searchbird/requests: 3 Searchbird/sent_bytes: 128 Searchbird/success: 3 jvm_gc_ConcurrentMarkSweep_cycles: 1 jvm_gc_ConcurrentMarkSweep_msec: 15 jvm_gc_ParNew_cycles: 24 jvm_gc_ParNew_msec: 191 jvm_gc_cycles: 25 jvm_gc_msec: 206gauges: Searchbird/connections: 1 Searchbird/pending: 0 jvm_fd_count: 135 jvm_fd_limit: 10240 jvm_heap_committed: 85000192 jvm_heap_max: 530186240 jvm_heap_used: 54778640 jvm_nonheap_committed: 89657344 jvm_nonheap_max: 136314880 jvm_nonheap_used: 66238144 jvm_num_cpus: 4 jvm_post_gc_CMS_Old_Gen_used: 36490088 jvm_post_gc_CMS_Perm_Gen_used: 54718880 jvm_post_gc_Par_Eden_Space_used: 0 jvm_post_gc_Par_Survivor_Space_used: 1315280 jvm_post_gc_used: 92524248 jvm_start_time: 1345072684280 jvm_thread_count: 16 jvm_thread_daemon_count: 7 jvm_thread_peak_count: 16 jvm

[1] [2] [3] [4] [5]  下一页


Searchbird