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 communicationbroadcast : 一對多 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。
沒有留言:
張貼留言