Run a task only once in (akka) cluster

在stackOverflow网站上见到这一提问,下文是有些摘抄难题简述:

一、引言

Java cluster, run task only once

We have a java process, which listen’s to a directory X on the file
system using apache commons vfs. Whenever a new file is exported to
this directory, our process kicks in. We first rename the file to
filename.processing and parse the file name, get some information from
the file and insert into tables, before sending this file to a
Document management system. This is a single-threaded application per
cluster. Now consider this running in a cluster environment, we have 5
server’s. So 5 different VM’s are trying to get access of the same
file. The whole implementation was on the basis that only one process
can rename the file to .processing at a given time, as OS will not
allow multiple processes modifying the file at the same time. Once a
cluster get’s holds and renames file to .processing, other cluster’s
will ignore files which are of format .processing.

     
设计格局写完了,也就是再一次学了五遍,每趟学习都会有不相同的感想,对设计方式的通晓又强化了,通晓的特别不亦乐乎了。还差一篇有关设计格局的下结论的篇章了,写完这篇总括性的稿子,设计方式的稿子就暂时要告一段了,那篇计算性的篇章作者会尽快补上的。在此之前日开端,笔者就把本人学习Redis的进度记录下载,以备以往查询看来。很久之前就接触过Redis,可是还没形成系统,近日有时光,就再次来读书一下,争取系统性的驾驭Redis的各类方面。好了,废话不多说了,开首正文。

上述难题大致,就是只要软件里有一个监听某个文件变化以及命名服务,那在单机计划时某些题目都不曾,不过当多机集群时,借使不加额外逻辑限制,那么每一种集群节点都会去履行五个监听以及命名服务,对于文件系统,那是分外惊险的。
还有诸如,软件里设有一个定时发送email的劳动,单机安排,那么接收方最多接到一份email。当多机集群布署时,即使不去额外限制,接收方应当接受到八个email。
题材是那几个额外的逻辑限制应当怎样去规划啊?
化解方案当然不止一种。

二、NoSQL简介和归类

Via a shared database

先是种你可以选取数据库,建立job表。
找出需求履行的job,然后去实践它,大约逻辑类似那样。

SELECT *
FROM jobs
WHERE state = 'NotRun'
  ORDER BY run_time ASC

UPDATE jobs
SET state = 'Running'
WHERE job_id = :id
  AND state = 'NotRun'

     
在软件创设进度中,如果软件系统的规模不是很大,用户流量也不是很大,像相似做法开发就好,也不需求采纳专门的技艺。假若大家付出的软件系统的用户量很大,大批量的用户频仍的拜访就会牵动其它一个题材,就是高并发,若是不可以很好的化解出现难点,会使系统运作缓慢,用户体验下跌,最终的结果是你的用户的汪洋破灭。对于一个Web系统的话,用户就是资金,那该怎么化解高并发的题材吧?有一项技术是必需要用到的,那就是缓存。大家先给大家介绍一个概念“NoSQL”,NoSQL是何许呢?大家来探视它的概念吧,如下:NoSQL(NoSQL
= Not Only SQL
),意即“不仅仅是SQL”,不仅仅只有关系型数据库,SQL代指关系型数据库,是一项崭新的数据库革命性运动,发展至二零零六年来势进一步高涨。NoSQL的跟随者们倡议使用非关系型的数量存储,这一定义无疑是一种崭新的盘算的注入。

Via a cluster singleton

凭借集群单例即可。
作者们来探视akka-cluster中对cluster singleton的描述。

For some use cases it is convenient and sometimes also mandatory to
ensure that you have exactly one actor of a certain type running
somewhere in the cluster.

我们清楚akka的架构是树状层级结构。就是说各个节点都对应着一个path。当akka.actor.providerLocalProvider是,ActorPath是从/user/somePath发端。当集群时,也等于akka.actor.providerClusterProvider或者RemoteProvider时,ActorPath是由akka.tcp://systemName@hots:port/user/somePath组成。

代码解析:

system.actorOf(
  ClusterSingletonManager.props(
    singletonProps = Props(classOf[Consumer], queue, testActor),
    terminationMessage = End,
    settings = ClusterSingletonManagerSettings(system).withRole("worker")),
  name = "consumer")
  val proxy = system.actorOf(
  ClusterSingletonProxy.props(
    singletonManagerPath = "/user/consumer",
    settings = ClusterSingletonProxySettings(system).withRole("worker")),
  name = "consumerProxy")

上述代码分为两步骤。第一步是创设一个集群单例对象,第二步创设单例对象的代办对象。
那就是说为啥须要那样设计呢?代理对象是逻辑地址,第一步创造的是单例的实际地址。

以下代码应用单例落成只举办一次的语义。

class OnlyExecuteOnce[A](exe: () => A) extends Actor {
  override def preStart(): Unit =
    exe()

  override def receive: Receive = {
    case _ => ()
  }
}


object OnlyExecuteOnce {
  // /user/onlyExecuteOnce1234
  // /user/onlyExecuteOnce1234Proxy
  def apply[A](id: String)(exe: () => A)(implicit system: ActorSystem) = {
    system.actorOf(
      ClusterSingletonManager.props(Props(classOf[OnlyExecuteOnce[A]], exe), PoisonPill, ClusterSingletonManagerSettings(system)),
      name = s"onlyExecuteOnce${id}")
    system.actorOf(ClusterSingletonProxy.props(s"/user/onlyExecuteOnce${id}", ClusterSingletonProxySettings(system)),
      name = s"onlyExecuteOnce${id}Proxy")
  }
}

参数id用于创设单例对象的path。

    我们大致的看看NoSQL的归类,看了它的分类,对我们领会Redis很有帮带。

  
1、键值(Key-Value)存储数据库
       
这一类数据库重点会采纳到一个哈希表,这些表中有一个一定的键和一个指南针指向特定的数码。Key/value模型对于IT系统来说的优势在于简单、易计划。不过一旦DBA只对一部分值进行询问或更新的时候,Key/value就展现功效低下了。类似数据库有:Tokyo
Cabinet/Tyrant,Redis,Voldemort, Oracle BDB。

    2、列存储数据库。
        
这项目标数据库一般是用来应对分布式存储的海量数据。键照旧存在,可是它们的风味是指向了八个列。这一个列是由列家族来布局的。该品种的数据库如下:Cassandra,HBase,Riak。

    3、文档型数据库
        
这项目的数据库和率先种键值存储相近似。该品种的数据模型是版本化的文档,半结构化的文档以一定的格式存储,比如JSON。文档型数据库可以用作是键值数据库的升官版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询功能更高。该类型的数据库有:CouchDB,MongoDb。
国内也有文档型数据库SequoiaDB,已经开源。

     4、图形(Graph)数据库
         
图形结构的数据库同其余行列以及刚性结构的SQL数据库差距,它是使用灵活的图样模型,并且可以壮大到三个服务器上。

    
NoSQL数据库没有专业的查询语言(SQL),由此开展数据库查询需求制订数据模型。许多NoSQL数据库都有REST式的数目接口恐怕查询API。如:Neo4J,InfoGrid,
Infinite Graph。

     今昔我们对NoSQL数据库有了中心的认识,NoSQL数据也是有协调的采用处境的,以下场面使用NoSQL数据库,如下:

    1、数据模型比较简单,复杂了不畏用关系型数据库了;

    2、必要灵活性更强的IT系统;

    3、对数据库性能须要较高;

   
4、不需求高度的数目一致性,比如Redis是支撑工作的,不过它的业务无法担保总体付出恐怕全体回滚的,约等于说数据的一致性不可以确保;

   
5、对于给定key,比较简单映射复杂值的环境。

   
大家收看了吗,其实Redis数据库就是属于NoSQL数据库里面的率先种分类,也等于“键值存储数据库”,所以说Redis也是NoSQL数据库的,没毛病。接下来,让大家认识一下Redis数据库吧。

三、Redis简介

    
在那里大家大致介绍一下Redis数据库,让大家对它有一个主导的认识,大家先来看看Redis数据库的定义吧。

     Remote Dictionary Server(Redis那个称谓是一个缩写)是一个基于
key-value
键值对的、可以持久化的、完全开源免费的、遵循BSD协议的内存数据库存储系统,常用作缓存只怕新闻队列。扶助各类数据结构,包括string (字符串)、list (链表)、set (集合)、zset (sorted set:有序聚集)和
hash(哈希类型)。这么些数据类型都协助 push/pop、add/remove
及取交集并集和差集及更拉长的操作,而且那么些操作都以原子性的。
    
    接下去,大家在说说Redis的优势的,倘诺没有优势,鬼才会选择它吧。

    1、读写质量极高 –
Redis读的速度是110000次/s,写的快慢是81000次/s,所以接纳Redis缓存数据,存取数据大约是0感觉,当然是对此用户来说的

    2、协理添加的数据类型 –
Redis援救添加的数据类型,如: String(字符串), Lists(链表),
Hash(哈希),Set(无序聚集) 及
ZSet(有序聚集)等数据类型,所以大家扬弃了Memched,因为它协助的数据类型太少了。

    3、所有操作支持原子性 –
Redis的所有操作都是原子性的,意思就是要么成功实施,要么战败。单个操作是原子性的。五个操作也支撑工作,即原子性,通过MULTI和EXEC指令包起来。

    4、丰裕的风味 – Redis协助publish/subscribe(发布/订阅),也支撑工作、队列、持久化,可以安装key过期时间等等特色。

    
好了,既然是简介,先就合计那里吧,还有许多特征,我们在求学的经过中在挨家挨户交代啊。

四、VMWare Pro和Linux的安装

    
到了这一节,是该上主食的时候了。Redis可以设置到Windows环境下,当然也可以安装到Linux环境下,那三种环境的设置作者都会相继介绍的。既然要设置到Liunx环境下,作者不想装多个系统,当然你可以装多个体系,比如:Windows
10 和 CentOS
7。选用的是首个方案,先装虚拟机,然后再在虚拟机中安装Redis。所以准备阶段要先把虚拟机和Linux系统安装好,上面大家就一步一步的教大家来操作,很简单,大家不用喷,假使大家很熟稔,能够跳过,作者写那段只是给本人留个备份,今后自个儿可以复习。不多说了,先河一步一步的装置。

    4.1、VMWare Pro的安装
         
1】、我们得以去“百度”,假设知道官网,也足以直接去官网下载VMWare
Pro软件安装包,地址如下:https://my.vmware.com/en/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/14_0?wd=&eqid=bdde195a00027b2c000000025a55be26,截图效果如下:[

](https://my.vmware.com/en/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/14_0?wd=&eqid=bdde195a00027b2c000000025a55be26)              
图片 1
        
2】、下载后,可以双击安装文件,伊始虚拟机的装置。出现【安装向导】对话框,直接点击【下一步】按钮,先导设置步骤。

              图片 2

        3】、接纳接受协议条款,然后点击【下一步】按钮,继续

              图片 3

       
4】、在这一步,我们可以变更安装目录,提出选拔【增强型键盘驱动程序】,然后点击【下一步】按钮,继续

               图片 4

             
在上图,点击【更改】按钮,打开【更改目标文件夹】对话框,在该对话框选用好目录,然后点击【确定】按钮,再次来到上一个对话框。

               图片 5

       
5】、在这一步,能够保障默许选项就好,然后点击【下一步】按钮,继续

              图片 6

       
6】、在“火速格局”这一步,为了协调使用方便,那两项作者都以采用,然后点击【下一步】按钮,继续

             图片 7

        7】、在这一步,已经准备好安装VMWare
Pro,然后,点击【安装】按钮,初始安装程序。

            图片 8

        
8】、在这一步,咱们得以看看安装的速度。安装速度完结后,会活动跳到成功页面。

              图片 9

        9】、安装到位,借使大家直接点击【落成】按钮,完毕VMWare
Pro的装置,该版本当前是试用版本,能够点击【许可证】按钮,继续表明。

              图片 10

       10】、输入VMware Workstation Pro 14
永久许可证激活密钥(FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA 或
CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD,二选一),点击【输入】按钮

             图片 11

         11】、最终,我们点击【完结】按钮,完成VMWare Pro的装置。

              图片 12

         12】、运行虚拟机,打开虚拟机的窗口,窗口如下:

             图片 13

        
13】、尽管设置的时候从不输入许可证秘钥,可以点击【支持】–【输入许可证秘钥】

            图片 14

         14】、输入VMware Workstation Pro 14
永久许可证激活密钥(FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA 或
CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD,二选一),点击确定,至此VMware Workstation
Pro 14设置进度整整截止。

            图片 15

         
15】、安装已毕了,我们看看大家的虚拟机是还是不是业已激活了,点击菜单【帮忙】–【关于VMWare
Workstations】,看到“许可证音信”的过期为:永然则期,证美素佳儿(Friso)(Ausnutria Hyproca)切安装到位。

            图片 16

         好了,到此截止,我们的VMware Workstation
Pro算是全体的、正确的安装到位了。大家有了虚拟机了,下一步,就要在虚拟机中安装Linux操作系统了。

    4.2、Linux的安装在虚拟机里的装置
       
         
1】、准备干活,准备怎么,大家最起码先要所须求的软件下载下来

                1.1)、下载和装置VMware
workstation14(此步已经成功)

               
1.2)、下载CentOS7安装包,地址如下:https://www.centos.org/download/,截图如下:[

](https://www.centos.org/download/)                  
图片 17

                1.3)、下载SSH Secure Shell
Client,这么些工具得以连接Linux系统,工具很好用。官网地址如下:https://www.ssh.com/ssh/,截图效果如下:

                   图片 18

          2】、VMware虚拟机的配备

                  2.1)、打开虚拟机软件“VMware
Workstation”,选用【创造新的虚拟机】,当然也可以从菜系里面打开创制虚拟机的窗口。

                      图片 19

                 
2.2)、显示【新建虚拟机向导】对话框,采纳“典型”选项,点击【下一步】按钮,继续

                     图片 20

                
2.3)、呈现【安装客户机操作系统】对话框,选取【稍后安装操作系统】,点击【下一步】按钮,继续

                      图片 21

                 
2.4)、呈现【拔取客户端操作系统】对话框,大家选用“Linux(L)”,版本选用“CentOS
7 64位”,点击【下一步】按钮,继续

                      图片 22

               
2.5)、在【命名虚拟机】对话框中,大家可以输入“虚拟机名称”;点击“浏览”按钮,选取虚拟机文件保留的地点;点击【下一步】按钮,继续

                     图片 23

              
2.6)、在【指定磁盘体积】对话框中,可以根据实际的动静,选拔本身规划,只怕应用的暗中认同设置,小编重新修改了弹指间“磁盘最大尺寸”,其余保障暗中同意的选项,点击【下一步】按钮,继续

                     图片 24

             
2.7)、到达此步步骤,表明,虚拟机的布置中央形成,然则,大家还要经过【自定义硬件】来布署ISO的文件映射,内存,CPU等音讯,那几个布局完结就足以设置系统了。我们继承点击【自定义硬件】按钮,来布署硬件,

                    图片 25

              
2.8)、在此步骤,大家要修改一下内存,私自认同值是1G,我设置为2G,可以按照本人的事态选用

                    图片 26

              2.9)、在当下对话框中,大家挑选【新CD/mp3】选项卡,
选拔【使用ISO镜像文件】,然后点击【浏览】,找到刚才下载的centOS7镜像文件,然后点击下边的【关闭】按钮,再次回到上层窗口。

                    图片 27

              
2.10)、在该窗口,我们点击【达成】按钮,到此,虚拟机就创办已毕了,上面大家该装置CentOS操作系统了。

                     图片 28

          3】、起初安装CentOS7操作系统

                3.1)、开启虚拟机

                    图片 29

              
3.2)、初叶设置CentOS系统,我相比幸运,一回就安装好了,没有会师什么样难题。

                      图片 30

              
3.2)、那是CentOS系统的设置进程,没什么可说的,大家就是等待就好了。

                      图片 31

              3.2)、选拔语言“中文-简体汉语”

                    图片 32

              3.3)、接下去显示“安装信息摘要”页面;

                   图片 33
   
             
3.4)、软件采纳:决定了系统安装后蕴含什么样职能,即使应用暗中认同值,那么系统装置后是未曾图形界面的;接纳“GNOME
桌面”,会来得图形界面;本着学习的目的,那里采纳暗许设置【最小安装】

                    图片 34

                  图片 35

             
3.5)、安装地方:分区配置大家接纳【自动配置分区】,该值也是暗中认可值。

                  图片 36

                 图片 37

             
3.6)、网络和主机名:打开连接开关,记住IP地址,SSH登录时行使,设置主机名,点击【应用】生效,单机【达成】按钮完毕安装。

                   图片 38

                 图片 39
                
              3.7)、发轫设置

                  图片 40

             
3.8)、设置ROOT密码,可以在装置系统的经过中设置Root的密码。

                  图片 41

              3.9)、将来可以安装了

                      图片 42

             
3.10)、依据步骤设置,最终安装完结,点击【重启】按钮,准备上马应用系统。

                      图片 43

                3.11)、系统重启后,Linux
login:root,密码就是您设置的密码,输入密码,展现如下图,讲明登陆成功。(必要验证,输入密码的时候不会现出*号,不会并发输入一个字符,就出现一个*号的景况。输入前,必须用鼠标点击Linux系统的土红桌面,才足以输入)

                    图片 44

          4】、以往我们应用SSH登录Linux

                 4.1)、打开SSH软件,点击【Quick
Connect(飞快链接)】按钮,来三番五次服务器。

                     图片 45

               
4.2)、配置连接,输入Linux系统的IP地址,端口号和用户名,然后点击【连接】按钮,起头三番五次。
                    
                     图片 46
                    
依据安装CentOS配置的以太网,获取IP地址:192.168.127.128,端口:22,是暗中认同值,用户名就是Root

               
4.3)、输入root的密码,如若是首先次三番五次,会提醒如下的窗口,依据本身的选项。

                    图片 47

                    图片 48

                4.4)、登录成功

                   图片 49

       
出现该窗口,表达使用SSH登陆Linux系统已经打响了。恭喜您,也恭喜作者要好。

五、总结

     
终于写完了,有恒河沙数截图要构建,所以时间上花的比较多,用了5个小时,可是对于本人来说是值得。仔细回看每一步,还似乎在面前,系统做好了,下一步就是在Linux系统上安装Redis了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注