❶ java是什麼意思
Java是一種可以撰寫跨平台應用軟體的面向對象的程序設計語言,是由Sun Microsystems公司於1995年5月推出的Java程序設計語言和Java平台(即JavaSE, JavaEE, JavaME)的總稱。
Java 技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於個人PC、數據中心、游戲控制台、科學超級計算機、行動電話和互聯網,同時擁有全球最大的開發者專業社群。
Java 由四方面組成:
Java編程語言,即語法。
Java文件格式,即各種文件夾、文件的後綴。
Java虛擬機(JVM),即處理*.class文件的解釋器。
Java應用程序介面(Java API)。
Java分為三個體系,分別為Java SE(J2SE,Java2 Platform Standard Edition,標准版),JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企業版),Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。
❷ java和php哪個好學
PHP學習
(1)熟悉HTML/CSS/JS等網頁基本元素,完成階段可自行製作完整的網頁,對元素屬性達到熟悉程度
(2)理解動態語言的概念,運做機制,熟悉PHP語法
(3)學習如何將PHP與HTML結合起來完成簡單動態頁面
(4)接觸MYSQL,開始設計資料庫程序
(5)不斷鞏固,摸透大部分PHP常用函數,並可理解OOP,MYSQL優化,以及模板
(6)完成一個功能齊全的動態站點
Java學習
1.學習JAVA的原理
了解JAVA的原理,才有可能真正體會JAVA的一切,學習任何事情,只要能掌握原理,就會比較順利。
學習JAVA語言很簡單,畢竟JAVA語言也只包含五十多個關鍵詞(keyword)與幾十個算符(operator),再加上JAVA語法(syntax)也很簡單,所以一般人可以很快就學會JAVA語言。
2.學習對象導向的思維
學會了語言,並不代表就可以設計出好的對象導向系統架構。想要成為對象導向的專家,往往需要:
(1)多看相關的書;
(2)多觀摩別人的程序;
(3)多寫程序。
總之六個字——多看,多學,多練。
3.學習API
學會JAVA語言之後,還需要學會一些API才能寫出有用的程序。JAVA的API非常多,必須規劃好一個學習路徑,才不會在浩瀚的API大海中迷失。
必備的API包括了:IO、New IO、Collection Framework、Network、RMI、JAXP等。
4.學習開發工具的用法
只用JDK,是很難寫出大型程序的,所以通常程序員會使用JBuilder/VisualAge/ VisualCafe 等工具。
PHP應用:
1、服務端腳本。
這是 PHP 最傳統,也是最主要的目標領域。開展這項工作需要具備以下三點:
A、PHP 解析器(CGI 或者伺服器模塊)、
B、web 伺服器、
C、web 瀏覽器。
需要在運行 web 伺服器時,安裝並配置 PHP,
然後,可以用 web 瀏覽器來訪問 PHP 程序的輸出,即瀏覽服務端的 PHP 頁面。
如果只是實驗 PHP 編程,所有的這些都可以運行在自己家裡的電腦中。
2、命令行腳本。
可以編寫一段 PHP 腳本,並且不需要任何伺服器或者瀏覽器來運行它。
通過這種方式,僅僅只需要 PHP 解析器來執行。
這種用法對於依賴 cron(Unix 或者 Linux 環境)
或者 Task Scheler(Windows 環境)的日常運行的腳本來說是理想的選擇。
這些腳本也可以用來處理簡單的文本。
3、編寫桌面應用程序。
對於有著圖形界面的桌面應用程序來說,PHP 或許不是一種最好的語言,
但是如果用戶非常精通 PHP,並且希望在客戶端應用程序中使用 PHP 的一些高級特性,
可以利用 PHP-GTK 來編寫這些程序。用這種方法,還可以編寫跨平台的應用程序。
PHP-GTK 是 PHP 的一個擴展,在通常發布的 PHP 包中並不包含它。
如果對 PHP-GTK 感興趣,請訪問其網站以獲取更多信息。
4、PHP應用領域還能擴展到更加廣泛的地步:
PHP
還支持利用諸如LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows環境)等不計其數的協議的服務。還可以開放原始網路埠,使得任何其它的協議能夠協同工作。PHP
支持和所有 web 開發語言之間的 WDDX 復雜數據交換。關於相互連接,PHP 已經支持了對 Java 對象的即時連接,並且可以將他們自由的用作 PHP
對象。甚至可以用我們的 CORBA 擴展庫來訪問遠程對象。PHP 具有極其有效的文本處理特性,支持從 POSIX 擴展或者 Perl 正則表達式到 XML
文檔解析。為了解析和訪問 XML 文檔,PHP 4 支持 SAX 和 DOM 標准,也可以使用 XSLT 擴展庫來轉換 XML 文檔。PHP 5 基於強健的
libxm2 標准化了所有的 XML 擴展,並添加了 SimpleXML 和 XMLReader 支持,擴展了其在 XML 方面的功能。
5、如果將PHP應用領域擴展到電子商務。
會發現其Cybercash 支付、CyberMUT、VeriSign Payflow Pro
以及 MCVE 函數對於在線交易程序來說是非常有用的。
6、另外,還有很多其它有趣的擴展庫。
例如: mnoGoSearch搜索引擎函數、IRC 網關函數、
多種壓縮工具(gzip、bz2)、日歷轉換、翻譯……
Java應用
1.JDBC(Java Database
Connectivity)提供連接各種關系資料庫的統一介面,作為數據源,可以為多種關系資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC為工具/資料庫開發人員提供了一個標準的API,據此可以構建更高級的工具和介面,使資料庫開發人員能夠用純Java
API 編寫資料庫應用程序,同時,JDBC也是個商標名。
2.EJB(Enterprise JavaBeans)使得開發者方便地創建、部署和管理跨平台的基於組件的企業應用。
3.Java RMI(Java Remote Method
Invocation)用來開發分布式Java應用程序。一個Java對象的方法能被遠程Java虛擬機調用。這樣,遠程方法激活可以發生在對等的兩端,也可以發生在客戶端和伺服器之間,只要雙方的應用程序都是用Java寫的。
4.Java IDL(Java Interface Definition Language) 提供與CORBA(Common Object
Request Broker Architecture)的無縫的互操作性。這使得Java能集成異構的商務信息資源。
5.JNDI(Java Naming and Directory
Interface)提供從Java平台到的統一的無縫的連接。這個介面屏蔽了企業網路所使用的各種命名和目錄服務。
6.JMAPI(Java Management API)為異構網路上系統、網路和服務管理的開發提供一整套豐富的對象和方法。
7.JMS(Java Message
Service)提供企業消息服務,如可靠的消息隊列、發布和訂閱通信、以及有關推拉(Push/Pull)技術的各個方面。
8.JTS(Java transaction
Service)提供存取事務處理資源的開放標准,這些事務處理資源包括事務處理應用程序、事務處理管理及監控。
9.JMF(Java Media Framework
API),她可以幫助開發者把音頻、視頻和其他一些基於時間的媒體放到Java應用程序或applet小程序中去,為多媒體開發者提供了捕捉、回放、編解碼等工具,是一個彈性的、跨平台的多媒體解決方案。
10.Annotation(Java
Annotation),在已經發布的JDK1.5(tiger)中增加新的特色叫Annotation。Annotation提供一種機制,將程序的元素如:類,方法,屬性,參數,本地變數,包和元數據聯系起來。這樣編譯器可以將元數據存儲在Class文件中。這樣虛擬機和其它對象可以根據這些元數據來決定如何使用這些程序元素或改變它們的行為。
在Java技術中,值得關注的還有JavaBeans,它是一個開放的標準的組件體系結構,它獨立於平台,但使用Java語言。一個JavaBean是一個滿足JavaBeans規范的Java類,通常定義了一個現實世界的事物或概念。一個JavaBean的主要特徵包括屬性、方法和事件。通常,在一個支持JavaBeans規范的開發環境(如Sun
Java Studio 和IBM VisualAge for
Java)中,可以可視地操作JavaBean,也可以使用JavaBean構造出新的JavaBean。JavaBean的優勢還在於Java帶來的可移植性。現在,EJB
(Enterprise JavaBeans)
將JavaBean概念擴展到Java服務端組件體系結構,這個模型支持多層的分布式對象應用。除了JavaBeans,典型的組件體系結構還有DCOM和CORBA,關於這些組件體系結構的深入討論超出了本書的范圍。
11.javaFXSun剛剛發布了JavaFX技術的正式版,它使您能利用JavaFX 編程語言開發富互聯網應用程序(RIA)。JavaFX
Script編程語言(以下稱為JavaFX)是Sun微系統公司開發的一種declarative,staticallytyped(聲明性的、靜態類型)腳本語言。JavaFX技術有著良好的前景,包括可以直接調用Java
API的能力。因為JavaFXScript是靜態類型,它同樣具有結構化代碼、重用性和封裝性,如包、類、繼承和單獨編譯和發布單元,這些特性使得使用Java技術創建和管理大型程序變為可能。
12.JMX(Java Management Extensions,即Java管理擴展)是一個為應用程序、設備、系統等植入
管理功能的框架。JMX可以跨越一系列異構操作系統平台、系統體系結構和網路傳輸協議,靈活的開發無縫
集成的系統、網路和服務管理應用。
13.JPA(Java Persistence API),JPA通過JDK
5.0註解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到資料庫中。
java-參見
計算機科學課程列表
JNI(Java Native Interface)Java本地介面,可以使用其他語言來實現Java的某些特定功能。
❸ 大型的PHP應用,通常使用什麼應用做消息隊列
一、消息隊列概述
消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合,非同步消息,流量削鋒等問題。實現高性能,高可用,可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。
目前在生產環境,使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。
二、消息隊列應用場景
以下介紹消息隊列在實際應用中常用的使用場景。非同步處理,應用解耦,流量削鋒和消息通訊四個場景。
2.1非同步處理
場景說明:用戶注冊後,需要發注冊郵件和注冊簡訊。傳統的做法有兩種1.串列的方式;2.並行方式。
(1)串列方式:將注冊信息寫入資料庫成功後,發送注冊郵件,再發送注冊簡訊。以上三個任務全部完成後,返回給客戶端。(架構KKQ:466097527,歡迎加入)
(2)並行方式:將注冊信息寫入資料庫成功後,發送注冊郵件的同時,發送注冊簡訊。以上三個任務完成後,返回給客戶端。與串列的差別是,並行的方式可以提高處理的時間。
假設三個業務節點每個使用50毫秒鍾,不考慮網路等其他開銷,則串列方式的時間是150毫秒,並行的時間可能是100毫秒。
因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串列方式1秒內CPU可處理的請求量是7次(1000/150)。並行方式處理的請求量是10次(1000/100)。
小結:如以上案例描述,傳統的方式系統的性能(並發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?
引入消息隊列,將不是必須的業務邏輯,非同步處理。改造後的架構如下:
按照以上約定,用戶的響應時間相當於是注冊信息寫入資料庫的時間,也就是50毫秒。注冊郵件,發送簡訊寫入消息隊列後,直接返回,因此寫入消息隊列的速度很快,基本可以忽略,因此用戶的響應時間可能是50毫秒。因此架構改變後,系統的吞吐量提高到每秒20 QPS。比串列提高了3倍,比並行提高了兩倍。
2.2應用解耦
場景說明:用戶下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的介面。如下圖:
傳統模式的缺點:
1) 假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗;
2) 訂單系統與庫存系統耦合;
如何解決以上問題呢?引入應用消息隊列後的方案,如下圖:
訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。
庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作。
假如:在下單時庫存系統不能正常使用。也不影響正常下單,因為下單後,訂單系統寫入消息隊列就不再關心其他的後續操作了。實現訂單系統與庫存系統的應用解耦。
2.3流量削鋒
流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛。
應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入消息隊列。
可以控制活動的人數;
可以緩解短時間內高流量壓垮應用;
用戶的請求,伺服器接收後,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面;
秒殺業務根據消息隊列中的請求信息,再做後續處理。
2.4日誌處理
日誌處理是指將消息隊列用在日誌處理中,比如Kafka的應用,解決大量日誌傳輸的問題。架構簡化如下:
日誌採集客戶端,負責日誌數據採集,定時寫受寫入Kafka隊列;
Kafka消息隊列,負責日誌數據的接收,存儲和轉發;
日誌處理應用:訂閱並消費kafka隊列中的日誌數據;
以下是新浪kafka日誌處理應用案例:
(1)Kafka:接收用戶日誌的消息隊列。
(2)Logstash:做日誌解析,統一成JSON輸出給Elasticsearch。
(3)Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的數據存儲服務,通過index組織數據,兼具強大的搜索和統計功能。
(4)Kibana:基於Elasticsearch的數據可視化組件,超強的數據可視化能力是眾多公司選擇ELK stack的重要原因。
2.5消息通訊
消息通訊是指,消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等。
點對點通訊:
客戶端A和客戶端B使用同一隊列,進行消息通訊。
聊天室通訊:
客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發布和接收。實現類似聊天室效果。
以上實際是消息隊列的兩種消息模式,點對點或發布訂閱模式。模型為示意圖,供參考。
三、消息中間件示例
3.1電商系統
消息隊列採用高可用,可持久化的消息中間件。比如Active MQ,Rabbit MQ,Rocket Mq。(1)應用將主幹邏輯處理完成後,寫入消息隊列。消息發送是否成功可以開啟消息的確認模式。(消息隊列返回消息接收成功狀態後,應用再返回,這樣保障消息的完整性)
(2)擴展流程(發簡訊,配送處理)訂閱隊列消息。採用推或拉的方式獲取消息並處理。
(3)消息將應用解耦的同時,帶來了數據一致性問題,可以採用最終一致性方式解決。比如主數據寫入資料庫,擴展應用根據消息隊列,並結合資料庫方式實現基於消息隊列的後續處理。
3.2日誌收集系統
分為Zookeeper注冊中心,日誌收集客戶端,Kafka集群和Storm集群(OtherApp)四部分組成。
Zookeeper注冊中心,提出負載均衡和地址查找服務;
日誌收集客戶端,用於採集應用系統的日誌,並將數據推送到kafka隊列;
四、JMS消息服務
講消息隊列就不得不提JMS 。JMS(Java Message Service,Java消息服務)API是一個消息服務的標准/規范,允許應用程序組件基於JavaEE平台創建、發送、接收和讀取消息。它使分布式通信耦合度更低,消息服務更加可靠以及非同步性。
在EJB架構中,有消息bean可以無縫的與JM消息服務集成。在J2EE架構模式中,有消息服務者模式,用於實現消息與應用直接的解耦。
4.1消息模型
在JMS標准中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。
4.1.1 P2P模式
P2P模式包含三個角色:消息隊列(Queue),發送者(Sender),接收者(Receiver)。每個消息都被發送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留著消息,直到他們被消費或超時。
P2P的特點
每個消息只有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中)
發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被發送到隊列
接收者在成功接收消息之後需向隊列應答成功
如果希望發送的每個消息都會被成功處理的話,那麼需要P2P模式。(架構KKQ:466097527,歡迎加入)
4.1.2 Pub/sub模式
包含三個角色主題(Topic),發布者(Publisher),訂閱者(Subscriber) 。多個發布者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
Pub/Sub的特點
每個消息可以有多個消費者
發布者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之後,才能消費發布者的消息。
為了消費消息,訂閱者必須保持運行的狀態。
為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。
如果希望發送的消息可以不被做任何處理、或者只被一個消息者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型。
4.2消息消費
在JMS中,消息的產生和消費都是非同步的。對於消費來說,JMS的消息者可以通過兩種方式來消費消息。
(1)同步
訂閱者或接收者通過receive方法來接收消息,receive方法在接收到消息之前(或超時之前)將一直阻塞;
(2)非同步
訂閱者或接收者可以注冊為一個消息監聽器。當消息到達之後,系統自動調用監聽器的onMessage方法。
JNDI:Java命名和目錄介面,是一種標準的Java命名系統介面。可以在網路上查找和訪問服務。通過指定一個資源名稱,該名稱對應於資料庫或命名服務中的一個記錄,同時返回資源連接建立所必須的信息。
JNDI在JMS中起到查找和訪問發送目標或消息來源的作用。(架構KKQ:466097527,歡迎加入)
4.3JMS編程模型
(1) ConnectionFactory
創建Connection對象的工廠,針對兩種不同的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory對象。
(2) Destination
Destination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來說,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來說,它的Destination也是某個隊列或主題(即消息來源)。
所以,Destination實際上就是兩種類型的對象:Queue、Topic可以通過JNDI來查找Destination。
(3) Connection
Connection表示在客戶端和JMS系統之間建立的鏈接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。
(4) Session
Session是操作消息的介面。可以通過session創建生產者、消費者、消息等。Session提供了事務的功能。當需要使用session發送/接收多個消息時,可以將這些發送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。
(5) 消息的生產者
消息生產者由Session創建,並用於將消息發送到Destination。同樣,消息生產者分兩種類型:QueueSender和TopicPublisher。可以調用消息生產者的方法(send或publish方法)發送消息。
(6) 消息消費者
消息消費者由Session創建,用於接收被發送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創建。當然,也可以session的creatDurableSubscriber方法來創建持久化的訂閱者。
(7) MessageListener
消息監聽器。如果注冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
深入學習JMS對掌握JAVA架構,EJB架構有很好的幫助,消息中間件也是大型分布式系統必須的組件。本次分享主要做全局性介紹,具體的深入需要大家學習,實踐,總結,領會。
五、常用消息隊列
一般商用的容器,比如WebLogic,JBoss,都支持JMS標准,開發上很方便。但免費的比如Tomcat,Jetty等則需要使用第三方的消息中間件。本部分內容介紹常用的消息中間件(Active MQ,Rabbit MQ,Zero MQ,Kafka)以及他們的特點。
5.1 ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息匯流排。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
ActiveMQ特性如下:
⒈ 多種語言和協議編寫客戶端。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
⒊ 對spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統裡面去,而且也支持Spring2.0的特性
⒋ 通過了常見J2EE伺服器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業伺服器上
⒌ 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通過JDBC和journal提供高速的消息持久化
⒎ 從設計上保證了高性能的集群,客戶端-伺服器,點對點
⒏ 支持Ajax
⒐ 支持與Axis的整合
⒑ 可以很容易得調用內嵌JMS provider,進行測試
5.2 RabbitMQ
RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標准實現。支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,持久化。用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
幾個重要概念:
Broker:簡單來說就是消息隊列伺服器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的許可權分離。
procer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務。
消息隊列的使用過程,如下:
(1)客戶端連接到消息隊列伺服器,打開一個channel。
(2)客戶端聲明一個exchange,並設置相關屬性。
(3)客戶端聲明一個queue,並設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關系。
(5)客戶端投遞消息到exchange。
exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列里。
5.3 ZeroMQ
號稱史上最快的消息隊列,它實際類似於Socket的一系列介面,他跟Socket的區別是:普通的socket是端到端的(1:1的關系),而ZMQ卻是可以N:M 的關系,人們對BSD套接字的了解較多的是點對點的連接,點對點連接需要顯式地建立連接、銷毀連接、選擇協議(TCP/UDP)和處理錯誤等,而ZMQ屏蔽了這些細節,讓你的網路編程更為簡單。ZMQ用於node與node間的通信,node可以是主機或者是進程。
引用官方的說法: 「ZMQ(以下ZeroMQ簡稱ZMQ)是一個簡單好用的傳輸層,像框架一樣的一個socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ的明確目標是「成為標准網路協議棧的一部分,之後進入Linux內核」。現在還未看到它們的成功。但是,它無疑是極具前景的、並且是人們更加需要的「傳統」BSD套接字之上的一 層封裝。ZMQ讓編寫高性能網路應用程序極為簡單和有趣。」
特點是:
高性能,非持久化;
跨平台:支持Linux、Windows、OS X等。
多語言支持; C、C++、Java、.NET、Python等30多種開發語言。
可單獨部署或集成到應用中使用;
可作為Socket通信庫使用。
與RabbitMQ相比,ZMQ並不像是一個傳統意義上的消息隊列伺服器,事實上,它也根本不是一個伺服器,更像一個底層的網路通訊庫,在Socket API之上做了一層封裝,將網路通訊、進程通訊和線程通訊抽象為統一的API介面。支持「Request-Reply 「,」Publisher-Subscriber「,」Parallel Pipeline」三種基本模型和擴展模型。
ZeroMQ高性能設計要點:
1、無鎖的隊列模型
對於跨線程間的交互(用戶端和session)之間的數據交換通道pipe,採用無鎖的隊列演算法CAS;在pipe兩端注冊有非同步事件,在讀或者寫消息到pipe的時,會自動觸發讀寫事件。
2、批量處理的演算法
對於傳統的消息處理,每個消息在發送和接收的時候,都需要系統的調用,這樣對於大量的消息,系統的開銷比較大,zeroMQ對於批量的消息,進行了適應性的優化,可以批量的接收和發送消息。
3、多核下的線程綁定,無須CPU切換
區別於傳統的多線程並發模式,信號量或者臨界區, zeroMQ充分利用多核的優勢,每個核綁定運行一個工作者線程,避免多線程之間的CPU切換開銷。
5.4 Kafka
Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者規模的網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網路上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的並行載入機制來統一線上和離線的消息處理,也是為了通過集群機來提供實時的消費。
Kafka是一種高吞吐量的分布式發布訂閱消息系統,有如下特性:
通過O(1)的磁碟數據結構提供消息的持久化,這種結構對於即使數以TB的消息存儲也能夠保持長時間的穩定性能。(文件追加的方式寫入數據,過期的數據定期刪除)
高吞吐量:即使是非常普通的硬體Kafka也可以支持每秒數百萬的消息。
支持通過Kafka伺服器和消費機集群來分區消息。
支持Hadoop並行數據載入。
Kafka相關概念
Broker
Kafka集群包含一個或多個伺服器,這種伺服器被稱為broker[5]
Topic
每條發布到Kafka集群的消息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存於一個或多個broker上但用戶只需指定消息的Topic即可生產或消費數據而不必關心數據存於何處)
Partition
Parition是物理上的概念,每個Topic包含一個或多個Partition.
Procer
負責發布消息到Kafka broker
Consumer
消息消費者,向Kafka broker讀取消息的客戶端。
Consumer Group
每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬於默認的group)。
一般應用在大數據日誌處理或對實時性(少量延遲),可靠性(少量丟數據)要求稍低的場景使用。
❹ java 中什麼是內部類啊麻煩給講解一下。謝謝!
樓上真牛...貼這么多...
簡單的說,內部類就是類中的類,舉個例子:
class A {
private int i;
private void m() {
}
class B {
mm(int j) {
i = j;
m();
}
}
}
這里,B就是A的內部類
內部類的特點就是,可以方便的訪問外部類裡面的私有方法和屬性,比如,這里B裡面可以直接訪問A裡面的私有屬性i,和私有方法m()
❺ Web前端和後端有啥區別,該如何選擇
前端開發人員:精通JS,能熟練應用JQuery,懂CSS,能熟練運用這些知識,進行交互效果的開發。
後端開發人員:會寫Java代碼,會寫SQL語句,能做簡單的資料庫設計,會Spring和iBatis,懂一些設計模式等
❻ 安裝PHP是報錯,求助
主頁index.php代碼如下:
PHP code?
<?php
require 'lib/core/DBAccess.class';
require 'lib/core/Object.class';
require 'action/default/WebBase.class.php';
require 'action/default/WebLoginBase.class.php';
require 'config.php';
//print_r($_SERVER);exit;
$para=array();
if(isset($_SERVER['PATH_INFO'])){
$para=explode('/', substr($_SERVER['PATH_INFO'],1));
if($control=array_shift($para)){
if(count($para)){
$action=array_shift($para);
}else{
$action=$control;
$control='index';
}
}else{
$control='index';
$action='main';
}
}else{
$control='index';
$action='main';
}
$control=ucfirst($control);
if(strpos($action,'-')!==false){
list($action, $page)=explode('-',$action);
}
$file=$conf['action']['modals'].$control.'.class.php';
if(!is_file($file)) notfound('找不到控制器');
try{
require $file;
}catch(Exception $e){
print_r($e);
exit;
}
if(!class_exists($control)) notfound('找不到控制器1');
$jms=new $control($conf['db']['dsn'], $conf['db']['user'], $conf['db']['password']);
$jms->debugLevel=$conf['debug']['level'];
if(!method_exists($jms, $action)) notfound('方法不存在');
$reflection=new ReflectionMethod($jms, $action);
if($reflection->isStatic()) notfound('不允許調用Static修飾的方法');
if(!$reflection->isFinal()) notfound('只能調用final修飾的方法');
$jms->controller=$control;
$jms->action=$action;
$jms->charset=$conf['db']['charset'];
$jms->cacheDir=$conf['cache']['dir'];
$jms->setCacheDir($conf['cache']['dir']);
$jms->actionTemplate=$conf['action']['template'];
$jms->prename=$conf['db']['prename'];
$jms->title=$conf['web']['title'];
if(method_exists($jms, 'getSystemSettings')) $jms->getSystemSettings();
if($jms->settings['switchWeb']=='0'){
$jms->display('close-service.php');
exit;
}
if(isset($page)) $jms->page=$page;
if($q=$_SERVER['QUERY_STRING']){
$para=array_merge($para, explode('/', $q));
}
if($para==null) $para=array();
$jms->headers=getallheaders();
if(isset($jms->headers['x-call'])){
// 函數調用
header('content-Type: application/json');
try{
ob_start();
echo json_encode($reflection->invokeArgs($jms, $_POST));
ob_flush();
}catch(Exception $e){
$jms->error($e->getMessage(), true);
}
}elseif(isset($jms->headers['x-form-call'])){
// 表單調用
$accept=strpos($jms->headers['Accept'], 'application/json')===0;
if($accept) header('content-Type: application/json');
try{
ob_start();
if($accept){
echo json_encode($reflection->invokeArgs($jms, $_POST));
}else{
json_encode($reflection->invokeArgs($jms, $_POST));
}
ob_flush();
}catch(Exception $e){
$jms->error($e->getMessage(), true);
}
}elseif(strpos($jms->headers['Accept'], 'application/json')===0){
// AJAX調用
header('content-Type: application/json');
try{
//echo json_encode($reflection->invokeArgs($jms, $para));
echo json_encode(call_user_func_array(array($jms, $action), $para));
}catch(Exception $e){
$jms->error($e->getmessage());
}
}else{
// 普通請求
header('content-Type: text/html;charset=utf-8');
//$reflection->invokeArgs($jms, $para);
call_user_func_array(array($jms, $action), $para);
}
$jms=null;
function notfound($message){
header('content-Type: text/plain; charset=utf8');
header('HTTP/1.1 404 Not Found');
die($message);
}
❼ 前端開發和後端開發有什麼區別
前端開發和後端開發的區別在於:
一、展示方式不同
1、前端開發主要做的是用戶所能看到的前端展示界面。
2、後端開發主要做的是邏輯功能等模塊,是用戶不可見的。
二、所用技術不同
1、前端開發用到的技術包括但不限於html5、css3、javascript、jquery、Bootstrap、Node.js 、AngularJs等技術。
2、後端開發 以java為例 主要用到的 是包括但不限於Struts spring springmvc Hibernate Http協議 Servlet Tomcat伺服器等技術。
(7)phpjms擴展閱讀:
公司對前後端人員招聘的要求:
Web前端:
1、精通HTML,能夠書寫語義合理,結構清晰,易維護的HTML結構;
2、精通CSS,能夠還原視覺設計,並兼容業界承認的主流瀏覽器;
3、熟悉JavaScript,了解ECMAScript基礎內容,掌握1到2種js框架,如JQuery;
4、對常見的瀏覽器兼容問題有清晰的理解,並有可靠的解決方案;
5、對性能有一定的要求,了解yahoo的性能優化建議,並可以在項目中有效實施;
Web後端:
1、精通jsp,servlet,javabean,JMS,EJB,Jdbc,Flex開發,或者對相關的工具、類庫以及框架非常熟悉,如Velocity,Spring,Hibernate,iBatis,OSGI等,對Web開發的模式有較深的理解;
2、練使用oracle、sqlserver、mysql等常用的資料庫系統,對資料庫有較強的設計能力;
3、熟悉maven項目配置管理工具,熟悉tomcat、jboss等應用伺服器,同時對在高並發處理情況下的負載調優有相關經驗者優先考慮;
4、精通面向對象分析和設計技術,包括設計模式、UML建模等;
5、熟悉網路編程,具有設計和開發對外API介面經驗和能力,同時具備跨平台的API規范設計以及API高效調用設計能力;
❽ j2ee是什麼
j2ee
J2EE Java2平台企業版(Java 2 Platform,Enterprise Edition)
J2EE是一套全然不同於傳統應用開發的技術架構,包含許多組件,主要可簡化且規范應用系統的開發與部署,進而提高可移植性、安全與再用價值。
J2EE核心是一組技術規范與指南,其中所包含的各類組件、服務架構及技術層次,均有共通的標准及規格,讓各種依循J2EE架構的不同平台之間,存在良好的兼容性,解決過去企業後端使用的信息產品彼此之間無法兼容,導致企業內部或外部難以互通的窘境。
在J2EE架構下,開發人員可依循規范基礎,進而開發企業級應用;而不同J2EE供貨商,同會支持不同J2EE版本內所擬定的標准,以確保不同J2EE平台與產品之間的兼容性。換言之,植基J2EE架構的應用系統,基本上可部署在不同的應用伺服器之上,無需或者只須要進行少量的代碼修改,即能大幅提高應用系統的可移植性(Portability)。
J2EE主由升陽(SUN)與IBM等廠商協同業界共同擬定而成的技術規范,以企業與企業之間的運算為導向的JAVA開發環境。J2EE架構定義各類不同組件,如Web Component、EJB Component…等,而各類組件可以再用(reuse),讓已開發完成的組件,或者是經由市面采購而得的組件,均能進一步組裝成不同的系統。
對於開發人員而言,只需要專注於各種應用系統的商業邏輯與架構設計,至於底層繁瑣的程序撰寫工作,可搭配不同的開發平台,以讓應用系統的開發與部署效率大幅提升。
J2EE的核心規范是 Enterprise Java Beans(EJBs)。EJB依照特性的不同,目前共分為三種,分別是Session Bean、Entity Bean,以及 Message Driven Bean 。其中 Session Bean 與Entity Bean 算是EJB的始祖,這兩種EJB規格在EJB 1.x版本推出時就已經存在,而Message Driven Bean則是出現在EJB 2.0的規格之中。
目前業界許多程序設計師,或者是網頁設計人員,多利用JSP/Servlet的便利性,進而在J2EE伺服器之上開發相關的應用,或是整合公司內部的各種資源。
Java 2平台依照應用領域的不同,共分為三大版本,分別是J2EE、標准版本J2SE(Java 2 Platform, Standard Edition)、微型版本J2ME(Java 2 Platform, Micro Edition),以及Java Card等。
從整體上講,J2EE是使用Java技術開發企業級應用的一種事實上的工業標准(Sun公司出於其自身利益的考慮,至今沒有將Java及其相關技術納入標准化組織的體系),它是Java技術不斷適應和促進企業級應用過程中的產物。Sun推出J2EE的目的是為了克服傳統Client/Server模式的弊病,迎合Browser/Server架構的潮流,為應用Java技術開發伺服器端應用提供一個平台獨立的、可移植的、多用戶的、安全的和基於標準的企業級平台,從而簡化企業應用的開發、管理和部署。J2EE是一個標准,而不是一個現成的產品。各個平台開發商按照J2EE規范分別開發了不同的J2EE應用伺服器,J2EE應用伺服器是J2EE企業級應用的部署平台。由於它們都遵循了J2EE規范,因此,使用J2EE技術開發的企業級應用可以部署在各種J2EE應用伺服器上。
為了推廣並規范化使用J2EE架構企業級應用的體系架構,Sun同時給出了一個建議性的J2EE應用設計模型:J2EE Blueprints。J2EE Blueprints提供了實施J2EE企業級應用的體系架構、設計模式和相關的代碼,通過應用J2EE Blueprints所描述的體系模型,能夠部分簡化架構企業級應用這項復雜的工作。J2EE Blueprints是開發人員設計和優化J2EE組件的基本原則,同時為圍繞開發工作進行職能分工給出了指導性策略,以幫助應用開發設計人員合理地分配技術資源。
J2EE組成了一個完整企業級應用的不同部分納入不同的容器(Container),每個容器中都包含若干組件(這些組件是需要部署在相應容器中的),同時各種組件都能使用各種J2EE Service/API。J2EE容器包括:
◆ Web容器 伺服器端容器,包括兩種組件JSP和Servlet,JSP和Servlet都是Web伺服器的功能擴展,接受Web請求,返回動態的Web頁面。Web容器中的組件可使用EJB容器中的組件完成復雜的商務邏輯。
◆ EJB容器 伺服器端容器,包含的組件為EJB(Enterprise JavaBeans),它是J2EE的核心之一,主要用於伺服器端的商業邏輯的實現。EJB規范定義了一個開發和部署分布式商業邏輯的框架,以簡化企業級應用的開發,使其較容易地具備可伸縮性、可移植性、分布式事務處理、多用戶和安全性等。
◆ Applet容器 客戶端容器,包含的組件為Applet。Applet是嵌在瀏覽器中的一種輕量級客戶端,一般而言,僅當使用Web頁面無法充分地表現數據或應用界面的時候,才使用它。Applet是一種替代Web頁面的手段,我們僅能夠使用J2SE開發Applet,Applet無法使用J2EE的各種Service和API,這是為了安全性的考慮。
◆ Application Client容器 客戶端容器,包含的組件為Application Client。Application Client相對Applet而言是一種較重量級的客戶端,它能夠使用J2EE的大多數Service和API。
通過這四個容器,J2EE能夠靈活地實現前面描述的企業級應用的架構。
在View部分,J2EE提供了三種手段:Web容器中的JSP(或Servlet)、Applet和Application Client,分別能夠實現面向瀏覽器的數據表現和面向桌面應用的數據表現。Web容器中的Servlet是實現Controller部分業務流程式控制制的主要手段;而EJB則主要針對Model部分的業務邏輯實現。至於與各種企業資源和企業級應用相連接,則是依靠J2EE的各種服務和API。
在J2EE的各種服務和API中,JDBC和JCA用於企業資源(各種企業信息系統和資料庫等)的連接,JAX-RPC、JAXR和SAAJ則是實現Web Services和Web Services連接的基本支持。
J2EE的各種組件
我們就J2EE的各種組件、服務和API,進行更加詳細的闡述,看看在開發不同類型的企業級應用時,根據各自需求和目標的不同,應當如何靈活使用並組合不同的組件和服務。
· Servlet
Servlet是Java平台上的CGI技術。Servlet在伺服器端運行,動態地生成Web頁面。與傳統的CGI和許多其它類似CGI的技術相比,Java Servlet具有更高的效率並更容易使用。對於Servlet,重復的請求不會導致同一程序的多次轉載,它是依靠線程的方式來支持並發訪問的。
· JSP
JSP(Java Server Page)是一種實現普通靜態HTML和動態頁面輸出混合編碼的技術。從這一點來看,非常類似Microsoft ASP、PHP等技術。藉助形式上的內容和外觀表現的分離,Web頁面製作的任務可以比較方便地劃分給頁面設計人員和程序員,並方便地通過JSP來合成。在運行時態,JSP將會被首先轉換成Servlet,並以Servlet的形態編譯運行,因此它的效率和功能與Servlet相比沒有差別,一樣具有很高的效率。
· EJB
EJB定義了一組可重用的組件:Enterprise Beans。開發人員可以利用這些組件,像搭積木一樣建立分布式應用。在裝配組件時,所有的Enterprise Beans都需要配置到EJB伺服器(一般的Weblogic、WebSphere等J2EE應用伺服器都是EJB伺服器)中。EJB伺服器作為容器和低層平台的橋梁管理著EJB容器,並向該容器提供訪問系統服務的能力。所有的EJB實例都運行在EJB容器中。EJB容器提供了系統級的服務,控制了EJB的生命周期。EJB容器為它的開發人員代管了諸如安全性、遠程連接、生命周期管理及事務管理等技術環節,簡化了商業邏輯的開發。EJB中定義了三種Enterprise Beans:
◆ Session Beans
◆ Entity Beans
◆ Message-driven Beans
· JDBC
JDBC(Java Database Connectivity,Java資料庫連接)API是一個標准SQL(Structured Query Language,結構化查詢語言)資料庫訪問介面,它使資料庫開發人員能夠用標准Java API編寫資料庫應用程序。JDBC API主要用來連接資料庫和直接調用SQL命令執行各種SQL語句。利用JDBC API可以執行一般的SQL語句、動態SQL語句及帶IN和OUT參數的存儲過程。Java中的JDBC相當與Microsoft平台中的ODBC(Open Database Connectivity)。
· JMS
JMS(Java Message Service,Java消息服務)是一組Java應用介面,它提供創建、發送、接收、讀取消息的服務。JMS API定義了一組公共的應用程序介面和相應語法,使得Java應用能夠和各種消息中間件進行通信,這些消息中間件包括IBM MQ-Series、Microsoft MSMQ及純Java的SonicMQ。通過使用JMS API,開發人員無需掌握不同消息產品的使用方法,也可以使用統一的JMS API來操縱各種消息中間件。通過使用JMS,能夠最大限度地提升消息應用的可移植性。 JMS既支持點對點的消息通信,也支持發布/訂閱式的消息通信。
· JNDI
由於J2EE應用程序組件一般分布在不同的機器上,所以需要一種機制以便於組件客戶使用者查找和引用組件及資源。在J2EE體系中,使用JNDI(Java Naming and Directory Interface)定位各種對象,這些對象包括EJB、資料庫驅動、JDBC數據源及消息連接等。JNDI API為應用程序提供了一個統一的介面來完成標準的目錄操作,如通過對象屬性來查找和定位該對象。由於JNDI是獨立於目錄協議的,應用還可以使用JNDI訪問各種特定的目錄服務,如LDAP、NDS和DNS等。
· JTA
JTA(Java Transaction API)提供了J2EE中處理事務的標准介面,它支持事務的開始、回滾和提交。同時在一般的J2EE平台上,總提供一個JTS(Java Transaction Service)作為標準的事務處理服務,開發人員可以使用JTA來使用JTS。
· JCA
JCA(J2EE Connector Architecture)是J2EE體系架構的一部分,為開發人員提供了一套連接各種企業信息系統(EIS,包括ERP、SCM、CRM等)的體系架構,對於EIS開發商而言,它們只需要開發一套基於JCA的EIS連接適配器,開發人員就能夠在任何的J2EE應用伺服器中連接並使用它。基於JCA的連接適配器的實現,需要涉及J2EE中的事務管理、安全管理及連接管理等服務組件。
· JMX
JMX(Java Management Extensions)的前身是JMAPI。JMX致力於解決分布式系統管理的問題。JMX是一種應用編程介面、可擴展對象和方法的集合體,可以跨越各種異構操作系統平台、系統體系結構和網路傳輸協議,開發無縫集成的面向系統、網路和服務的管理應用。JMX是一個完整的網路管理應用程序開發環境,它同時提供了廠商需要收集的完整的特性清單、可生成資源清單表格、圖形化的用戶介面;訪問SNMP的網路API;主機間遠程過程調用;資料庫訪問方法等。
· JAAS
JAAS(Java Authentication and Authorization Service)實現了一個Java版本的標准Pluggable Authentication Mole(PAM)的框架。JAAS可用來進行用戶身份的鑒定,從而能夠可靠並安全地確定誰在執行Java代碼。同時JAAS還能通過對用戶進行授權,實現基於用戶的訪問控制。
· JACC
JACC(Java Authorization Service Provider Contract for Containers)在J2EE應用伺服器和特定的授權認證伺服器之間定義了一個連接的協約,以便將各種授權認證伺服器插入到J2EE產品中去。
· JAX-RPC
通過使用JAX-RPC(Java API for XML-based RPC),已有的Java類或Java應用都能夠被重新包裝,並以Web Services的形式發布。JAX-RPC提供了將RPC參數(in/out)編碼和解碼的API,使開發人員可以方便地使用SOAP消息來完成RPC調用。同樣,對於那些使用EJB(Enterprise JavaBeans)的商業應用而言,同樣可以使用JAX-RPC來包裝成Web服務,而這個Web Servoce的WSDL界面是與原先的EJB的方法是對應一致的。JAX-RPC為用戶包裝了Web服務的部署和實現,對Web服務的開發人員而言,SOAP/WSDL變得透明,這有利於加速Web服務的開發周期。
· JAXR
JAXR(Java API for XML Registries)提供了與多種類型注冊服務進行交互的API。JAXR運行客戶端訪問與JAXR規范相兼容的Web Servcices,這里的Web Services即為注冊服務。一般來說,注冊服務總是以Web Services的形式運行的。JAXR支持三種注冊服務類型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository等)。
· SAAJ
SAAJ(SOAP with Attachemnts API for Java)是JAX-RPC的一個增強,為進行低層次的SOAP消息操縱提供了支持。
企業級應用示例
下面我們通過假設一個企業應用的J2EE實現,來了解各種組件和服務的應用。假設應用對象是計算機產品的生產商/零售商的銷售系統,這個銷售系統能夠通過自己的網站發布產品信息,同時也能將產品目錄傳送給計算機產品交易市場。銷售系統能夠在線接受訂單(來自自己的Web網站或者來自計算機產品交易市場),並隨後轉入內部企業管理系統進行相關的後續處理。
參見圖3,這個企業應用可以這種方式架構。該企業應用的核心是產品目錄管理和產品定購管理這兩個業務邏輯,使用EJB加以實現,並部署在EJB容器中。由於產品目錄和定購信息都需要持久化,因此使用JDBC連接資料庫,並使用JTA來完成資料庫存取事務。
圖3 J2EE應用示例
然後使用JSP/Servlet來實現應用的Web表現:在線產品目錄瀏覽和在線定購。為了將產品目錄發送給特定的交易市場,使用JMS實現非同步的基於消息的產品目錄傳輸。為了使得更多的其它外部交易市場能夠集成產品目錄和定購業務,需要使用Web Services技術包裝商業邏輯的實現。由於產品定購管理需要由公司內部雇員進行處理,因此需要集成公司內部的用戶系統和訪問控制服務以方便雇員的使用,使用JACC集成內部的訪問控制服務,使用JNDI集成內部的用戶目錄,並使用JAAS進行訪問控制。由於產品訂購事務會觸發後續的企業ERP系統的相關操作(包括倉儲、財務、生產等),需要使用JCA連接企業ERP。
最後為了將這個應用納入到企業整體的系統管理體系中去,使用Application Client架構了一個管理客戶端(與其它企業應用管理應用部署在一台機器上),並通過JMX管理這個企業應用。
❾ php的amqp應該怎樣使用
高級消息隊列協議(AMQP)是一個非同步消息傳遞所使用的應用層協議規范。作為線路層協議,而不是API(例如JMS),AMQP 客戶端能夠無視消息的來源任意發送和接受信息。現在,已經有相當一部分不同平台的伺服器和客戶端可以投入使用。
Broker:簡單來說就是消息隊列伺服器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的許可權分離。
procer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務。
即 Client - AMQP server - Client
左邊的Client向右邊的Client發送消息,流程:
1,獲取Conection
2,獲取Channel
3,定義Exchange,Queue
4,使用一個RoutingKey將Queue Binding到一個Exchange上
5,通過指定一個Exchange和一個RoutingKey來將消息發送到對應的Queue上,
6,接收方在接收時也是獲取connection,接著獲取channel,然後指定一個Queue直接到它關心的Queue上取消息,它對Exchange,RoutingKey及如何binding都不關心,到對應的Queue上去取消息就OK了
生產方
<?php
$conn_args=array('host'=>'localhost','port'=>5672,'login'=>'guest','password'=>'guest','vhost'=>'/');
$conn=newAMQPConnection($conn_args);
if($conn->connect()){
echo" ";
}else{
echo"Cannotconnecttothebroker ";
}
$e_name='ex_test5';//交換機名橫
$q_name='q_test5';//隊列名稱
$r_key='key_test1';
//你的消息
$message=json_encode(array('HelloWorld!'));
//創建channel
$channel=newAMQPChannel($conn);
//創建exchange
$ex=newAMQPExchange($channel);
$ex->setName($e_name);//創建名字
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE|AMQP_AUTODELETE);
echo"exchangestatus:".$ex->declare();
echo" ";
//創建隊列
$q=newAMQPQueue($channel);
//設置隊列名字如果不存在則添加
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE|AMQP_AUTODELETE);
echo"queuestatus:".$q->declare();
echo" ";
echo'queuebind:'.$q->bind($e_name,$r_key);//將你的隊列綁定到routingKey
echo" ";
$channel->startTransaction();
echo"send:".$ex->publish($message,$r_key);//將你的消息通過制定routingKey發送
$channel->commitTransaction();
$conn->disconnect();
?>
消費方
<?php
$conn_args=array('host'=>'localhost','port'=>5672,'login'=>'guest','password'=>'guest','vhost'=>'/');
//$q_name='q_test6';//隊列名稱
$q_name=$_GET['q'];//隊列名稱
$conn=newAMQPConnection($conn_args);
$conn->connect();
$channel=newAMQPChannel($conn);
$q=newAMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE|AMQP_AUTODELETE);
while($a=$q->declare())
{
echo"queuestatus:".$a;
echo"========== ";
$messages=$q->get(AMQP_AUTOACK);
print_r($messages->getBody());
echo" ";
}
$conn->disconnect();
?>