Azure Service Fabric – Tổng Quan Sơ Bộ

Ở bài này focus vào 2 vấn đề chính:

  • Azure service fabric là gì
  • Lý do tại sao phải cần đó.

Azure Service Fabric

Service Fabric Platform là một thế hệ tiếp theo của platform-as-a-service cung cấp bởi microsoft.
Nó được dùng thử từ tháng 5 năm 2015 và chính thức vào đầu năm 2016. Nó được gọi là Paas 2.0 nó không chỉ hỗ trợ stateless services mà còn hỗ trợ stateful services để xây đựng một ứng dụng doanh nghiệp có hiệu quả cao, tin cậy và có khả năng mở rộng. Hiện nay Microsoft PaaS 1. 0 chủ yếu là cung cấp cho Web role or Worker như stateless services mà không thể duy trì trạng thái. Microsoft cũng nói rằng đây là công nghệ tương tự như quyền hạn cơ sở hạ tầng đám mây của họ và nhiều dịch vụ khác như Skype for business, dù Hubs, DocumentDB, và Azure SQL Databases.

Azure Service Fabric có thể nói là 1 framework phá vỡ nhanh chóng các vấn đề phức tạp của doanh nghiệp  vào độ tin cậy và khả năng mở rộng của stateless microservices và stateful microservices, triển khải và đóng gói một cách dễ dàng.

appwithstatelessservices

An application built using stateless services

appwithstatefulservices

An application built using stateful services

Có thể thấy rằng  ở ứng dụng sử dung stateful servuces: front end services là load balanced (Cân bằng tải) để handle request từ end users trong nhiều stateful microservices làm các công việc cụ thể phía sau Bởi vì dữ liệu có thể được tin cậy tục tồn tại trong dịch vụ, chúng tôi không phải lấy hoặc lưu dữ liệu từ một cửa hàng bên ngoài cho mọi yêu cầuBởi vì dữ liệu có thể được tin cậy tục tồn tại trong dịch vụ, chúng tôi không phải lấy hoặc lưu dữ liệu từ một strore bên ngoài cho mọi request như ứng dụng sử dụng chỉ sử dụng stateless services.

Paas 2.0 so với Paas 1.0

Sự khác biệt lơn nhất của Paas 2.0 so với Paas 1.0 là giới thiệu về stateful services trong version sau. bây giờ với Azure Service Fabric bạn có thể tạo stateful services có thể giữ dữ liệu đáng tin cậy giữa nhiều bản sao triển khai trên nhiều node (VM). Điều này loại bỏ sự cần thiết phải sử dụng dịch vụ  caching services, queues, or database calls để fetch hoặc save data cho mỗi request.

20150503194703

Simplistic architecture of Service Fabric vs. existing cloud services

Thuật ngữ liên quan

Stateless là design không lưu dữ liệu của client trên server. Có nghĩa là sau khi client gửi dữ liệu lên server, server thực thi xong, trả kết quả thì “quan hệ” giữa client và server bị “cắt đứt” – server không lưu bất cứ dữ liệu gì của client. Như vậy, khái niệm “trạng thái” ở đây được hiểu là dữ liệu và cụm “phi trạng thái” có thể làm nhiều người hiểu sai bản chất vấn đề.

Stateful là một design ngược với stateless, server cần lưu dữ liệu của client, điều đó đồng nghĩa với việc ràng buộc giữa client và server vẫn được giữ sau mỗi request (yêu cầu) của client. Data được lưu lại phía server có thể làm đầu vào (input parameters) cho lần kế tiếp, hoặc là dữ kiện dùng trong quá trình xử lý hay phục phụ cho bất cứ nhu cầu nào phụ thuộc vào bussiness (nghiệp vụ) cài đặt.

Đặc Tính microservice

  • Encapsulate a customer or business scenario. What is the problem you are solving?
  • Developed by a small engineering team.
  • Written in any programming language and use any framework.
  • Consist of code and (optionally) state, both of which are independently versioned, deployed, and scaled.
  • Interact with other microservices over well-defined interfaces and protocols.
  • Have unique names (URLs) used to resolve their location.
  • Remain consistent and available in the presence of failures.

Advertisements

A Client-side Command Line App in Python

import sys,requests,json

BASE_URL =’http://raps’

def printLightToconsole(light):
print(‘light {0} has house code of {1} and unit code of {2}’.
format(light[‘lightId’],light[‘houseCode’],light[‘unitCode’]))

def printSingleLight(lightId):
returnedJson = requests.get(BASE_URL+’/’+lightId).json()
printfSingleLight(returnedJson)

def printAllLights():
returnedJson = requests.get(BASE_URL).json()
for light in returnedJson[‘light’]
printLightToconsole(light)

def addLight(lightId,houseCode,unitCode):
lightsJson = json.dumps({“lightId”:lightId,”houseCode”:houseCode,”unitCode”:unitCode})
requestHeaders = {‘content-type’:’application/json’,’Accept’:’text/plain’}
requests.post(BASE_URL,data=lightsJson,headers=requestHeaders)
def setLightState(lightId,command):
requests.put(BASE_URL+’/{0}/{1}’.format(lightId,command))

def deleteLight(lightId):
requests.delete(BASE_URL+’/’+lightId)

def process(argv):
if(argv[0] == ‘getall’):
printAllLights()
elif(argv[0] == ‘get’)
printSingleLight(argv[1])
elif(argv[0] == ‘add’)
addLight(argv[1],argv[2],argv[3])
elif(argv[0] == ‘set’)
setLightState(argv[1],argv[2])
elif(argv[0] == ‘delete’)
deleteLight(argv[1])

if __name__ == ‘__main__’:
process(sys.argv[1:])

Using REST Verbs and JSON to Add or Remove Lights

import web
import json

from CM19aDriver import CM19aDrive

urls = (‘/message’,’hello’,
‘/lights/(on|off)’,’lights’,
‘/lights’,’lights’
‘/lights/(.*?)’,’lights’,
‘/lights/(.*?)’,’Error’,)
app = web.application(urls,globals())

class hello:
_mesage = json.dumps({})

def GET(self):
return json.dumps(hello._mesage)

def POST(self):
hello._mesage = json.loads(web.data())

class Lights:
_lightsJson = json.dumps({“lights”:[{“lighId”:”officeDesk”,”houseCode”:”A”,”unitCode”:”1″}]})

def GET(self,lighId = None)
if (lighId is None):
return json.dumps(self.retrieveLightsFromStore())
else
return json.dumps(self.getMatchingLight(lighId))

def POST(self):
newLight = json.loads(web.data())
fullJson = self.retrieveLightsFromStore()
currentLight = fullJson[‘lights’]
currentLight.append(newLight)
Lights._lightsJson = json.dumps(fullJson)

def DELETE(self,lighId):
jsonData = self.retrieveLightsFromStore
updateLights = [light for light in jsonData[‘lights’] if light[lighId] != lighId]
jsonData[‘lights’] = updateLights
self.writeLightsToStore(jsonData)

def PUT(self,lighId,command):

matchingLight = self.getMatchingLight(lighId)

cm19a – CM19aDrive();
retult = cm19a.send(matchingLight[‘houseCode’],matchingLight[‘unitCode’],command)
cm19a.finish()

def getMatchingLight(self, lighId):
jsonData = self.retrieveLightsFromStore()
matchingLight = next(node for node in jsonData[‘lights’] if node[lighId] == lighId)
return matchingLight
def retrieveLightsFromStore(self):
return json.loads(Lights._lightsJson)

def writeLightsToStore(self,pythonJson):
Lights._mesage = json.dumps(pythonJson)

class Error():
def PUT(self,command):
printf(“User enter invalid command: ” + command)

if __name__ == ‘__main__’:
app.run()

Laying out a Route Map Structure for Lights

1) add a Put method to indicate modification of state
2) Verify that we can hit the Put method
3) Invoke the CM19a Driver from Put method of lights on and off
4) Understand precedentce in route specification

import web
import json

from CM19aDriver import CM19aDrive

urls = (‘/lights/(on|off)’,’lights’)
app = web.application(urls,globals())

 

class lights:

def PUT(seft,command):
cm19a – CM19aDrive();
retult = cm19a.send(‘A’,’1′,command)
cm19a.finish()

if __name__ == ‘__main__’:
app.run()