當前位置:首頁 » 編程軟體 » 腳本原語

腳本原語

發布時間: 2023-08-23 18:19:59

Ⅰ zookeeper集群為什麼是3個以上節點

Apache Zookeeper是我最近遇到的最酷的技術,我是在研究Solr Cloud功能的時候發現的。Solr的分布式計算讓我印象深刻。你只要開啟一個新的實例就能自動在Solr Cloud中找到。它會將自己分派到某個分片中,並確定出自己是一個Leader(源)還是一個副本。不一會兒,你就可以在你的那些伺服器上查詢到了。即便某些伺服器宕機了也可以繼續工作。非常動態、聰明、酷。

將運行多個應用程序作為一個邏輯程序並不是什麼新玩意。事實上,我在幾年前就已寫過類似的軟體。這種架構比較讓人迷惑,使用起來也費勁。為此Apache Zookeeper提供了一套工具用於管理這種軟體。

為什麼叫Zoo?「因為要協調的分布式系統是一個動物園」。

在本篇文章中,我將說明如何使用php安裝和集成Apache ZooKeeper。我們將通過service來協調各個獨立的PHP腳本,並讓它們同意某個成為Leader(所以稱作Leader選舉)。當Leader退出(或崩潰)時,worker可檢測到並再選出新的leader。

ZooKeeper是一個中性化的Service,用於管理配置信息、命名、提供分布式同步,還能組合Service。所有這些種類的Service都會在分布式應用程序中使用到。每次編寫這些Service都會涉及大量的修bug和競爭情況。正因為這種編寫這些Service有一定難度,所以通常都會忽視它們,這就使得在應用程序有變化時變得難以管理應用程序。即使處理得當,實現這些服務的不同方法也會使得部署應用程序變得難以管理。

雖然ZooKeeper是一個Java應用程序,但C也可以使用。這里就有個PHP的擴展,由Andrei Zmievski在2009創建並維護。你可以從PECL中下載,或從GitHub中直接獲取PHP-ZooKeeper。
要使用該擴展你首先要安裝ZooKeeper。可以從官方網站下載。
$ tar zxfv zookeeper-3.4.5.tar.gz
$ cd zookeeper-3.4.5/src/c
$ ./configure --prefix=/usr/
$ make
$ sudo make install

這樣就會安裝ZooKeeper的庫和頭文件。現在准備編譯PHP擴展。

$ cd$ git clone https://github.com/andreiz/php-zookeeper.git
$ cd php-zookeeper
$ phpize
$ ./configure
$ make
$ sudo make install

將「zookeeper.so」添加到PHP配置中。

$ vim /etc/php5/cli/conf.d/20-zookeeper.ini

因為我不需要運行在web服務環境下,所以這里我只編輯了CLI的配置。將下面的行復制到ini文件中。

extension=zookeeper.so

使用如下命令來確定擴展是否已起作用。

$ php -m | grep zookeeper
zookeeper

現在是時候運行ZooKeeper了。目前唯一還沒有做的是配置。創建一個用於存放所有service數據的目錄。
$ mkdir /home/you-account/zoo
$ cd$ cd zookeeper-3.4.5/
$ cp conf/zoo_sample.cfg conf/zoo.cfg
$ vim conf/zoo.cfg

找到名為「dataDir」的屬性,將其指向「/home/you-account/zoo」目錄。

$ bin/zkServer.sh start
$ bin/zkCli.sh -server 127.0.0.1:2181[zk: 127.0.0.1:2181(CONNECTED) 14] create /test 1
Created /test[zk: 127.0.0.1:2181(CONNECTED) 19] ls /[test, zookeeper]

此時,你已成功連到了ZooKeeper,並創建了一個名為「/test」的znode(稍後我們會用到)。ZooKeeper以樹形結構保存數據。這很類似於文件系統,但「文件夾」(譯者註:這里指非最底層的節點)又和文件很像。znode是ZooKeeper保存的實體。Node(節點)的說法很容易被混淆,所以為了避免混淆這里使用了znode。

因為我們稍後還會使用,所以這里我們讓客戶端保持連接狀態。開啟一個新窗口,並創建一個zookeeperdemo1.php文件。

<?php
class ZookeeperDemo extends Zookeeper {

public function watcher( $i, $type, $key ) {
echo "Insider Watcher\n";

// Watcher gets consumed so we need to set a new one
$this->get( '/test', array($this, 'watcher' ) );
}
}
$zoo = new ZookeeperDemo('127.0.0.1:2181');$zoo->get( '/test', array($zoo, 'watcher' ) );
while( true ) {
echo '.';
sleep(2);}

現在運行該腳本。

$ php zookeeperdemo1.php

此處應該會每隔2秒產生一個點。現在切換到ZooKeeper客戶端,並更新「/test」值。

[zk: 127.0.0.1:2181(CONNECTED) 20] set /test foo

這樣就會靜默觸發PHP腳本中的「Insider Watcher」消息。怎麼會這樣的?

ZooKeeper提供了可以綁定在znode的監視器。如果監視器發現znode發生變化,該service會立即通知所有相關的客戶端。這就是PHP腳本如何知道變化的。Zookeeper::get方法的第二個參數是回調函數。當觸發事件時,監視器會被消費掉,所以我們需要在回調函數中再次設置監視器。

現在你可以准備創建分布式應用程序了。其中的挑戰是讓這些獨立的程序決定哪個(是leader)協調它們的工作,以及哪些(是worker)需要執行。這個處理過程叫做leader選舉,在ZooKeeper Recipes and Solutions你能看到相關的實現方法。

這里簡單來說就是,每個處理(或伺服器)緊盯著相鄰的那個處理(或伺服器)。如果一個已被監視的處理(也即Leader)退出或者崩潰了,監視程序就會查找其相鄰(此時最老)的那個處理作為Leader。

在真實的應用程序中,leader會給worker分配任務、監控進程和保存結果。這里為了簡化,我跳過了這些部分。
創建一個新的PHP文件,命名為worker.php。

<?php
class Worker extends Zookeeper {

const CONTAINER = '/cluster';

protected $acl = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone' ) );
private $isLeader = false;

private $znode;

public function __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000 ) {
parent::__construct( $host, $watcher_cb, $recv_timeout );
}

public function register() {
if( ! $this->exists( self::CONTAINER ) ) {
$this->create( self::CONTAINER, null, $this->acl );
}

$this->znode = $this->create( self::CONTAINER . '/w-',
null,
$this->acl,
Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );

$this->znode = str_replace( self::CONTAINER .'/', '', $this->znode );

printf( "I'm registred as: %s\n", $this->znode );

$watching = $this->watchPrevious();

if( $watching == $this->znode ) {
printf( "Nobody here, I'm the leader\n" );
$this->setLeader( true ); }
else {
printf( "I'm watching %s\n", $watching );
}
}

public function watchPrevious() {
$workers = $this->getChildren( self::CONTAINER );
sort( $workers );
$size = sizeof( $workers );
for( $i = 0 ; $i < $size ; $i++ ) {
if( $this->znode == $workers[ $i ] ) {
if( $i > 0 ) {
$this->get( self::CONTAINER . '/' . $workers[ $i - 1 ], array( $this, 'watchNode' ) );
return $workers[ $i - 1 ];
}

return $workers[ $i ];
}
}

throw new Exception( sprintf( "Something went very wrong! I can't find myself: %s/%s",
self::CONTAINER,
$this->znode ) );
}

public function watchNode( $i, $type, $name ) {
$watching = $this->watchPrevious();
if( $watching == $this->znode ) {
printf( "I'm the new leader!\n" );
$this->setLeader( true );
}
else {
printf( "Now I'm watching %s\n", $watching ); }
}

public function isLeader() {
return $this->isLeader;
}

public function setLeader($flag) {
$this->isLeader = $flag;
}

public function run() {
$this->register();

while( true ) {
if( $this->isLeader() ) {
$this->doLeaderJob();
}
else {
$this->doWorkerJob();
}

sleep( 2 );
}
}

public function doLeaderJob() {
echo "Leading\n";
}

public function doWorkerJob() {
echo "Working\n";
}
}
$worker = new Worker( '127.0.0.1:2181' );$worker->run();

打開至少3個終端,在每個終端中運行以下腳本:

# term1
$ php worker.php
I'm registred as: w-0000000001Nobody here, I'm the leader
Leading
# term2
$ php worker.php
I'm registred as: w-0000000002I'm watching w-0000000001
Working
# term3
$ php worker.php
I'm registred as: w-0000000003I'm watching w-0000000002
Working

現在模擬Leader崩潰的情形。使用Ctrl+c或其他方法退出第一個腳本。剛開始不會有任何變化,worker可以繼續工作。後來,ZooKeeper會發現超時,並選舉出新的leader。

雖然這些腳本很容易理解,但是還是有必要對已使用的Zookeeper標志作注釋。
$this->znode = $this->create( self::CONTAINER . '/w-', null, $this->acl, Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );

每個znode都是EPHEMERAL和SEQUENCE的。

EPHEMRAL代表當客戶端失去連接時移除該znode。這就是為何PHP腳本會知道超時。SEQUENCE代表在每個znode名稱後添加順序標識。我們通過這些唯一標識來標記worker。

在PHP部分還有些問題要注意。該擴展目前還是beta版,如果使用不當很容易發生segmentation fault。比如,不能傳入普通函數作為回調函數,傳入的必須為方法。我希望更多PHP社區的同仁可以看到Apache ZooKeeper的好,同時該擴展也會獲得更多的支持。

ZooKeeper是一個強大的軟體,擁有簡潔和簡單的API。由於文檔和示例都做的很好,任何人都可以很容易的編寫分布式軟體。讓我們開始吧,這會很有趣的。

Ⅱ 腳本語言的特點

腳本或腳本語言是一種特殊運行時環境的編程語言,可以自動執行任務[1];這些任務可以由操作員一個接一個地執行。腳本語言經常被解釋(而不是編譯)。
原語通常是基本任務,或者API函數調用,這種語言允許它們被組合成更多的程序。可以通過腳本自動化的環境包括軟體應用程序、網頁瀏覽器中的網頁、操作系統shell的使用、嵌入式系統以及許多游戲。腳本語言可以被視為特定環境的特定領域語言;在編寫應用程序腳本的情況下,它也稱為擴展語言。腳本語言有時也被稱為非常高級的編程語言,因為它們在高抽象層次上運行,或者被稱為控制語言,特別是針對大型機上的作業控制語言。
術語「腳本語言」也泛指動態高級通用語言,如Perl[2]、PowerShell、Python和Tcl[3],術語「腳本」通常用於這些語言中的小程序(最多幾千行代碼),或用於特定領域的語言,如文本處理語言sed和AWK。這些語言中的一些最初是為在特定環境中使用而開發的,後來發展成可移植的特定領域語言或通用語言。相反,許多通用語言都有用作腳本語言的方言。本文討論了針對特定環境的狹義語言中的腳本語言。
腳本語言的范圍分布從非常小且非常特定的領域的語言到用於腳本的通用編程語言。針對特定環境的腳本語言的標准示例包括:Bash,針對Unix或類似於Unix的操作系統;ECMAScript (JavaScript),用於網路瀏覽器;和 Visual Basic宏語言,針對微軟辦公軟體。Lua是一種被設計和廣泛用作擴展語言的語言。Python是一種通用語言,也通常用作擴展語言,而ECMAScript仍然主要是網路瀏覽器的腳本語言,但也用作通用語言。Lisp的Emacs Lisp方言(供Emacs編輯器使用)和Visual Basic的Visual Basic 宏語言方言是通用語言腳本語言方言的示例。一些游戲系統,特別是第二人生虛擬世界和鐵路模擬器專營權,已經通過腳本擴展( Linden腳本語言和 TrainzScript)在功能上得到廣泛擴展。在像 Wesnoth這樣的其他游戲中,玩家玩的各種實際游戲都是由其他用戶編寫的腳本。

Ⅲ 怎樣選擇Java測試框架 JUnit還是TestNG

TestNG和JUnit是針對Java語言的兩個比較常用的測試框架。JUnit出現的比較早,但是早期的JUnit3對測試代碼有非常多的限制,使用起來很不方便,後來的JUnit4得到很大的改進。TestNG的出現介於JUnit3和JUnit4,但是TestNG在很多方面還要優於JUnit4。下面從整體上對TestNG和JUnit4進行比較全面的比較。


TestNG與JUnit的相同點:

  1. 使用annotation,且大部分annotation相同。

  2. 都可以進行單元測試(Unittest)。

  3. 都是針對Java測試的工具。


TestNG與JUnit的不同點:

  1. JUnit只能進行單元測試,TestNG可以進行單元測試(unittest),功能測試(functiontest),端到端測試(e2etest),集成測試(Integrationtest)等。

  2. TestNG需要一個額外的xml配置文件,配置測試的class、method甚至package。

  3. TestNG的運行方式更加靈活:命令行、ant和IDE,JUnit只能使用IDE。

  4. TestNG的annotation更加豐富,比如@ExpectedExceptions、@DataProvider等。

  5. 測試套件運行失敗,JUnit4會重新運行整個測試套件。TestNG運行失敗時,會創建一個XML文件說明失敗的測試,利用這個文件執行程序,就不會重復運行已經成功的測試。


TestNG比JUnit4靈活性的體現:

  1. JUnit4中必須把@BeforeClass修飾的方法聲明為publicstatic,這就限制了該方法中使用的變數必須是static。而TestNG中@BeforeClass修飾的方法可以跟普通函數完全一樣。

  2. JUnit4測試的依賴性非常強,測試用例間有嚴格的先後順序。前一個測試不成功,後續所有的依賴測試都會失敗。TestNG利用@Test的dependsOnMethods屬性來應對測試依賴性問題。某方法依賴的方法失敗,它將被跳過,而不是標記為失敗。

  3. 對於n個不同參數組合的測試,JUnit4要寫n個測試用例。每個測試用例完成的任務基本是相同的,只是受測方法的參數有所改變。TestNG的參數化測試只需要一個測試用例,然後把所需要的參數加到TestNG的xml配置文件中。這樣的好處是參數與測試代碼分離,非程序員也可以修改參數,同時修改無需重新編譯測試代碼。

  4. 為了測試無法用String或原語值表示的復雜參數化類型,TestNG提供的@DataProvider使它們映射到某個測試方法。

  5. JUnit4的測試結果通過Green/Redbar體現,TestNG的結果除了Green/Redbar,還有Console窗口和test-output文件夾,對測試結果的描述更加詳細,方便定位錯誤。


簡單說就是TestNG比Junit強大,但是那些更強大的功能你全部都用不到的話,那你還是就用junit,比較簡單,國人用的多,出了問題中文也比較好查.英文還不錯並且有想要了解除了單元測試以外的測試的話,就用TestNG吧

Ⅳ Java語言的特點有哪些

面向對象:其實是現實世界模型的自然延伸。現實世界中任何實體都可以看作是對象。對象之間通過消息相互作用。另外,現實世界中任何實體都可歸屬於某類事物,任何對象都是某一類事物的實例。如果說傳統的過程式編程語言是以過程為中心以演算法為驅動的話,面向對象的編程語言則是以對象為中心以消息為驅動。用公式表示,過程式編程語言為:程序=演算法+數據;面向對象編程語言為:程序=對象+消息。 所有面向對象編程語言都支持三個概念:封裝、多態性和繼承,Java也不例外。現實世界中的對象均有屬性和行為,映射到計算機程序上,屬性則表示對象的數據,行為表示對象的方法(其作用是處理數據或同外界交互)。所謂封裝,就是用一個自主式框架把對象的數據和方法聯在一起形成一個整體。可以說,對象是支持封裝的手段,是封裝的基本單位。Java語言的封裝性較強,因為Java無全程變數,無主函數,在Java中絕大部分成員是對象,只有簡單的數字類型、字元類型和布爾類型除外。而對於這些類型,Java也提供了相應的對象類型以便與其他對象交互操作。

可移植性:就是在這個系統上作的程序經過一次編譯後可以移植到別的系統上解釋執行,只要經過簡單的粘貼和復制就行了,不影響程序的效果

安全性:在 iSeries 伺服器上運行的大多數 Java(TM) 程序是應用程序,而不是 applet,所以「砂箱」安全性模型對它們不起限製作用。從安全性的觀點看,Java 應用程序所受的安全性限制與 iSeries 伺服器上的任何其它程序相同。要在 iSeries 伺服器上運行 Java 程序,您必須對集成文件系統中的類文件具有許可權。程序一旦啟動,它就在該用戶許可權控制下運行。 您可以使用沿用許可權來訪問具有運行程序的用戶的許可權和程序擁有者許可權的對象。沿用許可權臨時地將用戶原先無權訪問的對象的許可權授予用戶。

並發性:JAVA支持多線程技術,就是多個線程並行機制,多線程是Java的一個重要方法,特別有利於在程序中實現並發任務.Java提供Thread線程類,實現了多線程的並發機制.然而,程序的並發執行必定會出現多個線程互斥訪問臨界資源的局面,因而並發系統解決的關鍵就是對臨界資源的管理和分配問題,而在進行臨界資源分配時有兩方面需要考慮,即安全性和公平性.文中首先討論了多線程並發系統中的安全性與公平性問題,指出安全性與公平性在並發系統中訪問臨界資源時的重要性.並通過火車行駛單行隧道的實例,演示各種條件下的行駛情況來進一步說明該問題.

可視化:不好說,像vb這樣的也是可視話的編成程序。
我借鑒了一些朋友的答案,還有一些是自己找啊,希望能給你帶來幫助

Ⅳ 提綱式腳本有什麼特點

提綱式腳本是一種特殊運行時環境的編程語言,可以自動執行任務[1];這些任務可以由操作員一個接一個地執行。腳本語言經常被解釋(而不是編譯)。
原語通常是基本任務,或者API函數調用,這種語言允許它們被組合成更多的程序。可以通過腳本自動化的環境包括軟體應用程序、網頁瀏覽器中的網頁、操作系統shell的使用、嵌入式系統以及許多游戲。腳本語言可以被視為特定環境的特定領域語言;在編寫應用程序腳本的情況下,它也稱為擴展語言。腳本語言有時也被稱為非常高級的編程語言,因為它們在高抽象層次上運行,或者被稱為控制語言,特別是針對大型機上的作業控制語言。

熱點內容
編程文件加密 發布:2024-11-20 23:08:57 瀏覽:434
舉報群源碼 發布:2024-11-20 23:07:46 瀏覽:482
華為雲php 發布:2024-11-20 22:46:20 瀏覽:900
sql2000實例名 發布:2024-11-20 22:30:13 瀏覽:416
先科伺服器ip 發布:2024-11-20 22:26:32 瀏覽:459
L0加密 發布:2024-11-20 22:23:12 瀏覽:77
win10怎麼取消跳過密碼登錄密碼 發布:2024-11-20 22:18:00 瀏覽:404
壓縮壞1台 發布:2024-11-20 22:17:58 瀏覽:187
輕松賺腳本 發布:2024-11-20 22:07:39 瀏覽:382
fpm緩存dns 發布:2024-11-20 21:56:37 瀏覽:908