code

2017年8月23日 星期三

Distributed Java 2 - Client-server programming

Sockets

分散的電腦網路節點群,每台電腦上面可能有一或多個正在執行的JVM instance (processes),想要彼此溝通可以使用low level construct: socket。


所以一個jvm endpoint建立一個client socket,另一個則扮演server endpoint,也建立一個server socket。

Java server socket:

1. 建立instance and listen
2. 一旦有人連過來,則先取得client socket reference(利用accept()),然後可以用此reference來read write client socket的資訊:


client side socket



Serialization / Deserialization

socket溝通是low level communication,是byte stream,但是programs是以high level abstraction在設計,是以objects為個體,所以如何把objects轉成bytes 透過socket傳出去,這個動作稱為 serialization。在接收方重建這些bytes為原本的object,稱為deserialization。

object可能有fields指向其他objects,構成一個graph。所以XML是一個為了描述這樣的object relationship graph的方法。但這個很大overhead。

Java program可以使用Serializable interface,並且可以使用@transient annotation來標注是否要serialize某些fields,這對optimization有幫助。

Remote Method Invocation (RMI)

如果本地端JVM物件y要呼叫遠端JVM上的x.foo(),怎麼辦?
其實Java有一個RMI framework,搞定了一切,他背後架構如下:


本地端RMI client有一個proxy object (stub),可以跟底層socket/network interface溝通,而遠端的JVM process要implement RMI server,同樣也有一個proxy object與底層溝通,稱為skeleton,其實就這樣。

還有x和y因為要透過網路溝通,必須要serializable。


Multi-cast Sockets

unicast : 點對點socket communication
broadcast : 一對多 in-LAN  socket communication
multicast : 一對多 over internet socket communication

multicast有以下的operations:


Publish-Subscribe 

producers publish topic messages,而consumers subscribe topics。



infrastructures可以distributed to 大數量的nodes,稱為brokers,負責流量控制。

一個implementation: Apache Kafka。


沒有留言:

張貼留言