1. 程式人生 > >今年調研的開源軟體(1)

今年調研的開源軟體(1)

1、什麼是gearman

Gearman是一套可以一個work傳遞其他機器,或者呼叫其他機器功能的應用程式框架。它允許並行工作,負載平衡處理,並排程不同語言之間的職能。它可用於各種應用,從高可用性的網站資料庫複製事件的運輸。簡單來說,Gearman是一個分散式的任務排程框架,它包括 a client,a worker ,a job server這三部分組成。

Gearman的執行過程:客戶端通過客戶端API(PHP,C,Perl等)建立一個任務傳送到job server上,Job Server 通過客戶端的function name 查詢合適的worker,並分到該worker上,worker接收到任務後根據worker的規則執行,並返回資料到job Server,而Job Server則把資料返回給客戶端,這樣Gearman的執行過程就結束了。

使用者可以根據不同的需求制定不同的worker來處理不同的任務,將這些worker存放到不同的伺服器上,Job Server會根據不同的客戶端傳送來的任務的function name尋找worker來執行,從而達到為業務伺服器減輕壓力;

2、Gearman的應用場景:

伺服器的訪問壓力比較大時,我們可以通過負載均衡來將負載分散到多臺伺服器上. 但有些比較耗時的請求.比如:

(1) 需要連線郵件伺服器,傳送一封超長的HTML郵件。

(2) 需要對使用者上傳的圖片進行裁剪,生成多份縮圖。

(3) 需要將使用者上傳的檔案分發到多臺伺服器上。

等等

在我們的日常應用中經常遇到,使用者需要等待一段時間,這個請求才能完成,比如在使用者上傳照片時,照片上傳成功後,然後是裁剪,最後生成縮圖,在這麼一 個過程中,使用者只能等待,所以對使用者的體驗來講是相當不好的。可能在使用者第一次使用過後,下次就很難再讓他使用這個圖片的上傳功能了。

那麼有沒有一種方法將這些處理過程放在後臺慢慢執行呢?答案是肯定的,通過分散式處理可以將這些比較耗時的任務放在後臺,甚至分散到多臺伺服器上去 處理,對於這個問題非同步處理就派上了用場。

現在有很多開源的軟體能實現非同步通訊,比如ActiveMQ、Hadoop、Gearman和MecacheMQ等,它們巧妙的將計算轉移到其他伺服器上,而這一切都是隱藏在API中,同時,這些機制都是跨語言的,可以用PHP來分配一個任務,然後將後臺的C/C++程式來進行處理,這一切都不是什麼問題。

3、安裝gearman:(1) 安裝gcc

$ yum install gcc44 gcc44-c++ libstdc++44-devel -y

   增加環境變數:
   export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc 
   export CXX=/usr/bin/g++44
   
   $ source /etc/profile  重新整理

(2) 安裝 boost

  $ cd /usr/local 
  $ mkdir boost
  $ tar xvzf boost_1_52_0.tar.gz
  $ cd boost_1_52_0
  $ ./bootstrap.sh –prefix=/usr/local/boost
  
    執行後會生成一個b2的可執行檔案
  $./b2 install
  
  安裝完成後需要修改一下環境變數
  $ vim /etc/profile
  新增:export CPPFLAGS=-I/usr/local/boost/include
     export LDFLAGS=-L/usr/local/boost/lib

  $ source /etc/profile 重新整理

  boost安裝成功 

(3) 安裝 gearmand

  在/usr/local目錄下建立gearmand目錄
  $ tar xvzf gearmand-1.1.4.tar.gz
  $ cd gearmand-1.1.4
  $  CC=gcc44 CXX=g++44 ./configure --disable-libmemcached --disable-libsqlite3 --with-boost=/usr/local/boost --prefix=/usr/local/gearmand/
  $ make
  $ make install
  $ vim /etc/ld.so.conf 
  增加 /usr/local/boost/lib
  $/sbin/ldconfig –v  更新配置(解決各種詭異的無法找到so包問題)
 
  $ /usr/local/gearmand/sbin/gearmand -p 4730 -u root --log-file=/tmp/gearmand-4730.log -d
  

(4) 安裝php擴充套件

  $ tar xvzf gearman-1.1.1.tgz 
  $ cd gearman-1.1.1
  
  
  $ /data1/adbox/local/php/bin/phpize
  $ ./configure --with-php-config=/data1/adbox/local/php/bin/php-config --with-gearman=/usr/local/gearmand
  $ make
  $ make install   
  
  cd /data1/adbox/local/php/lib/php/extensions/no-debug-non-zts-20090626/
  如果目錄裡面有gearman擴充套件 
  vim /data1/adbox/local/php/lib/php.ini  
  增加 extension = gearman.so;
  
  然後重啟php
  $kill -USR2 php 2742 (php-fpm的主程序號)
  
  安裝好後可以通過一個小程式測試下是否安裝成功,儲存為verify_gearman.php:
  
  <?php
        print gearman_version() . "\n";
  ?>
  
  如果返回1.1.4 ,證明安裝成功。

4、gearman功能測試

(1) 開啟gearmand 守護程序

   
   $ gearmand -L 127.0.0.1 -p 4730  -u root –d
   

(2) php 例項

  給出了用 PHP 編寫的一個 Gearman worker。將這些程式碼儲存在一個名為 worker.php 的檔案中。
   <?php
   
        $worker= new GearmanWorker();
        
        $worker->addServer();
        
        $worker->addFunction("gangfeng", "gangfeng_feed_function");
        
        while ($worker->work());
        
        function gangfeng_feed_function($job)
        
        {
        
           $enter_string = ($job->workload());
           
           $welcome = "welcome to the feed queue , I am worker\n";
           
           return $welcome.$enter_string;
           
        }
        
   ?>
  給出了用 PHP 編寫的一個 Gearman client。將這些程式碼儲存在一個名為 client.php 的檔案中。
  <?php
        $client= new GearmanClient();             
        
        $client->addServer();
        
        echo "start\n";
        
        echo $client->do("gangfeng", json_encode("abcd"));
        
        echo "end\n";   
   ?>
   

現在,可以用如下的命令列連線客戶機與 worker 了:

   
   /data1/adbox/local/php/bin/php worker.php &
   
   /data1/adbox/local/php/bin/php client.php
   
   如果返回
   
   start
   welcome to the feed queue , I am worker
   "abcd"end
   
   證明執行成功。
   
   
   解釋:
   
   json_encode(“abcd”) 這個引數值必須是字串 不能是陣列, 可以進行序列化或json 傳送

5、gearman 擴充套件

(1) 如果有多個worker會怎麼樣呢,我們繼續操作上面的例子:

   $ cp worker.php worker1.php (修改裡面的I am worker 為 I am worker1);
   
   $ /data1/adbox/local/php/bin/php worker1.php &
   
   $ /data1/adbox/local/php/bin/php client.php (執行多次前,思考下返回結果)
   
   start
   welcome to the feed queue , I am worker
   "abcd"end
   
   start
   welcome to the feed queue , I am worker1
   "abcd"end 
   

(2) 非同步處理

給出了用 PHP 編寫的一個 Gearman worker。將這些程式碼儲存在一個名為 worker2.php 的檔案中。

<?php

      $worker = new GearmanWorker();
      $worker->addServer();
      $worker->addFunction("reverse","my_reverse_function");
      while ($worker->work());
      function my_reverse_function($job) {
              sleep(1);
              echo strrev($job->workload());
              echo "I am worker2\n";
      }

?>

給出了用 PHP 編寫的一個 Gearman worker。將這些程式碼儲存在一個名為 worker3.php 的檔案中。

<?php

      $worker = new GearmanWorker();
      $worker->addServer();
      $worker->addFunction("reverse","my_reverse_function");
      while ($worker->work());
      function my_reverse_function($job) {
              sleep(1);
              echo strrev($job->workload());
              echo "I am worker3\n";
      }

?>

給出了用 PHP 編寫的一個 Gearman client。將這些程式碼儲存在一個名為 client2.php 的檔案中。

<?php

      $client = new GearmanClient();
      $client->addServer();
      echo "beginning...\n";
      for ($i = 0; $i < 100; $i++) {
              $client->doBackground('reverse',($i+1).'_Hello World!')."\n";
      }
      echo "finishing...\n";

?>

這裡的Client2.php就是任務的發起者,這裡用兩個worker連續處理100次字串反轉任務

        $ /data1/adbox/local/php/bin/php worker2.php &
        $ /data1/adbox/local/php/bin/php worker3.php &
        $ /data1/adbox/local/php/bin/php client2.php
        會返回
        beginning...
        finishing...
        然後我們看下worker返回
        !dlroW olleH_1I am worker2
        !dlroW olleH_2I am worker3
        !dlroW olleH_3I am worker2
        !dlroW olleH_4I am worker3
        !dlroW olleH_5I am worker2...
        發現在client2.php執行完成後,Worker2 和work3 則是每秒輸出一條處理結果,直到所有的任務全部處理完成.

以上主要是說明非同步處理是怎麼回事,在目前的開發中,怎麼將耗時過長的任務進行非同步來處理。但在日常的開發中,可能有些任務耗時確實很長,但處理後的結果又需要很快的反饋給使用者時,這裡我們就需要將處理後的結果即時的儲存到資料庫中,然後靠專門的程式將結果反饋給使用者。可能還會有一個問題,這樣非同步處理,萬一處理失敗了怎麼辦,同樣的道理,我們可以將每個任務的處理狀態儲存起來,然後用程式定時的去掃描,將處理失敗的任務再重啟執行一次,反覆下去,直接它成功完成為止。

(3) 持久化儲存

如果我們執行一個 worker 後,然後執行client2.php,在client2.php的過程中,試著kill掉worker2.php,然後client2.php會終止執行。然後再重新開啟worker2.php ,結果client2.php還是正常地完成它的工作;這是因為Job Server 幫我們把需求先放在 Queue 裡,等待 Worker 啟動後再處理。

Gearman 的最新版本已經將系統特性擴充套件到了包含持久的作業佇列和用一個新協議來通過 HTTP 提交工作請求。對於前者,Gearman 工作佇列儲存在記憶體並在一個關係型資料庫記憶體有備份。這樣一來,如果 Gearman 守護程式故障,它就可以在重啟後重新建立這個工作佇列。另一個最新的改良通過一個 memcached 叢集增加佇列永續性。memcached 儲存也依賴於記憶體,但被分散於幾個機器以避免單點故障。

(4) 高階特性

一個連線客戶機和 worker 的 Gearman 網路實際上可以使用任何您能想象得到的結構。很多配置能夠執行多個代理並將 worker 分配到許多機器上。負載均衡是隱式的:每個可操作的可用 worker(可能是每個 worker 主機具有多個 worker)從佇列中拉出作業。一個作業能夠同步或非同步執行並具有優先順序。

相關推薦

今年調研開源軟體1

1、什麼是gearman Gearman是一套可以一個work傳遞其他機器,或者呼叫其他機器功能的應用程式框架。它允許並行工作,負載平衡處理,並排程不同語言之間的職能。它可用於各種應用,從高可用性的網站資料庫複製事件的運輸。簡單來說,Gearman是一個分散式的任務排程框架

Android常用開源工具1-Dagger2入門

介紹 Dagger 2是一種依賴注入的框架,能夠在編譯時自動生成出一些程式碼,這些程式碼可以幫助對應的例項初始化。 舉個具體的例子,一個容器裡面裝的是蘋果,不用Dagger2的情況下我們應該這麼寫: public class Container

wkhtmltopdf 協助後端匯出複雜pdf檔案的第三方軟體1

1、首先,去wkhtmltopdf下載對應版本的Linux版本,地址如下:https://wkhtmltopdf.org/down

開源】OSharp框架學習系列1:總體設計及系列導航

正是 html 組織 內聚性 權限 是什麽 enc 3-0 分發 OSharp是什麽?   OSharp是個快速開發框架,但不是一個大而全的包羅萬象的框架,嚴格的說,OSharp中什麽都沒有實現。與其他大而全的框架最大的不同點,就是OSharp只做抽象封裝,不做實現。依賴註

開源分享:入門到精通ASP.NET MVC+EF6+Bootstrap】從這裏開始,一起搭框架1開篇介紹

strong src 擁有 ckeditor 開發 技術分享 mdi 控制 https 框架簡介 這幾年一直在做ASP.NET開發,幾年前做項目都是老老實實一行行的寫代碼,後來發現那些高手基本都會有自己積累起來的代碼庫,現在稱之為開發框架,基礎代碼不用再去堆,

訊息中介軟體activeMQ1

開篇只是提出了訊息中間的定義,點對點、訂閱兩種模式下的訊息傳輸特點和AactiveMQ中訊息傳遞和接收的流程。 基本概念: MOM 就是面向訊息中介軟體(Message-oriented middleware),是用於以分散式應用或系統中的非同步、鬆耦合、可靠、可擴充套件和安全通訊的一類軟體

開源容器openshift學習筆記1:新增Router元件

開篇之前如果沒有安裝openshift環境可以參考我的博文:centos7下安裝openshift 本系列部落格學習筆記參考《開源容器雲openshift》一書:下載連線:https://download.csdn.net/download/u012371097/10745382  

activemq訊息中介軟體--JMS概述1

1 JMS概述 目前現在很多的RPC中介軟體技術都有如下問題: (1)同步通訊,客戶端發出呼叫請求,必須等待服務端處理完成以後返回結果才能繼續執行。 (2)客戶和服務物件的生命週期緊密耦合,客戶程序和服務程序都必須正常進行,如果由於服務物件的崩潰和網路故障導致客戶請求不可達,客戶收到

設計模式之軟體開發原則1開閉原則和依賴倒置原則

開閉原則 定義 所謂開閉原則就是一個軟體實體如類、模組和函式應該對擴充套件開放、對修改關閉。 強呼叫抽象構建框架,實現實現拓展細節。 有優點是提高軟體的複用性和易維護展性。是面向物件的最基本原則。 依賴倒置原則 定義 高層模組不應該依賴底層模組,二者都應該依賴其抽象。 抽象不應該依賴細節:細節應該

中文NLP1 -- 開源工具 ltp 和 stanford

完整的程式碼和模型檔案可在我的GitHub:(程式碼是 linux 版本,windows 上執行只需要簡單調整) https://github.com/ouprince/pyltp-stanford-nlp   windows 下執行調整如下:將父類 StanfordCor

軟體工程專業的認識1

剛入大學,並不知道“軟體工程”專業是做什麼的,百度了一下也沒看太懂就先簡單理解為開發軟體的吧。那會學校掛著大大的橫幅每個橫幅上面幾乎都有“碼”這個字,不知道到底啥意思。後來接觸的C語言原來就是打程式碼啊。 當我打出第一行程式碼“Hello world!”,妥了,我覺得我對我學的這個專業很

openalyer4+geoserver+pgrouting+postgresql+QGIS 所需軟體安裝 1

1、服務端GeoServer伺服器 符合openGIS web伺服器規範的開源伺服器 1.1、在win環境下配置GeoServer伺服器 1.1.1、安裝java環境 在終端執行java –version,檢查是否安裝java環境,如何提示java命令找不到的錯誤,先安裝java

軟體測試基礎知識1

軟體測試: 從執行狀態來看分為:動態測試、靜態測試; 從按執行過程來看分為:手工測試、自動化測試; 從內容劃分來看:功能測試、易用性測試、相容性測試、文件測試等, 從用例設計來看:黑盒測試、白盒測試、灰盒測試; 按開發:單元測試、系統測試、整合測試、驗

五、學習筆記-Linux軟體包管理1

流行的兩種軟體包管理機制 (1)Debian Linux首先提出“軟體包”的管理機制—Deb軟體包 將應用程式的二進位制檔案、配置檔案、man/info幫助頁面等檔案合併打包在一個檔案中,使用者使用軟體包管理器直接操作軟體包,完成獲取、安裝、解除安裝、查詢等操作。 (2)Redhat L

訊息中介軟體學習總結1——RocketMQ之專訪RocketMQ聯合創始人:專案思路、技術細節和未來規劃

編者按 這些年開源氛圍越來越好,各大IT公司都紛紛將一些自研程式碼開源出來。2012年,阿里巴巴開源其自研的第三代分散式訊息中介軟體——RocketMQ。經過幾年的技術打磨,阿里稱基於RocketMQ技術,目前雙十一當天訊息容量可達到萬億級。 2016年11月,阿里將Ro

Burp Suit的軟體的使用初體驗1

Burp Suit的安裝和使用 Burp Suite對於網站應用程式的掃描來說,絕對是必不可少的大神奇,他可以幫助滲透測試人員方便的開展全方位的網站滲透測試,這對於漏洞和資訊的獲取極為關鍵,因為絕大多數的網路滲透總是從Web上開始的。 首先,我們需要的是安裝Bu

手把手教你做一個新浪部落格釋出軟體JAVA版本1--開頭的話

     前言:很多人用新浪部落格引流,但是以前可以用api釋出,但是現在已經行不通了,市面上也有諸如新浪部落格批量釋出軟體啦,新浪部落格批量發帖啦,新浪部落格釋出軟體啊等等的各種工具,但是小心中槍,一不小心就封號處理了,所以得不償失,於是乎就想自己寫一個,找來找去,找

有限元計算軟體Fenics安裝使用筆記1

開篇寫點個人思考: 來深圳快一年多了,越來越感覺圈子的重要性,我不是一個喜歡抱怨的人,但有時很多事情真的是身不由己,生活註定孤獨,誰不想風花雪月,吟詩彈琴呢?找三五好友,有空得聚,沒空得散,但很多人走著走著就散了,唯有惋惜而已,話題說的有點遠了。迴歸正題。送可愛

軟體測試之實用小工具推薦1

1.Snipaste截圖工具 Snipaste是一款佔用記憶體很小而且免費的截圖軟體,在windows的商城中即可找到這款軟體並下載安裝,安裝後他會一直後臺執行,直到你喚醒他的時候再出現;    使用Snipaste截圖主要有兩種方式,一種是使用快捷鍵截圖,預設操作

iOS超全開源框架、專案和學習資料彙總1UI篇

上下拉重新整理控制元件**1. ** --僅需一行程式碼就可以為UITableView或者CollectionView加上下拉重新整理或者上拉重新整理功能。可以自定義上下拉重新整理的文字說明。(推薦)**2. ** --下拉重新整理控制元件4500+star,值得信賴**3. ** --一個效果很酷炫的