利用京東雲Serverless服務快速構建5G時代的IoT應用

Alt
10月31日,在2019年中國國際信息通信展覽會上,工信部宣佈:5G商用正式啓動。5G商用時代來了!

5G的商用,使得數據傳輸速度、響應速度、連接數據、數據傳輸量、傳輸可靠性等方面都有了顯著的提升,這一技術的突破才使得很多領域的應用場景得以真正的落地實施,走進普通人的生活,而這其中就包括物聯網。

雖然物聯網的概念很簡明,就是把物品與互聯網相連接並進行信息交換和通訊,從而實現萬物智能化,但是由於各種原因,商業化的應用並沒有大規模的落地,其中一方面是由於網絡傳輸等原因的限制。如今,5G的到來使得物聯網應用在網絡層面不再受限,更好地促進了物聯網的發展。對於企業來說,快速構建一個商用的物聯網服務,搶佔先機就顯得尤爲重要。

京東雲Serverless服務正適應瞭如今企業的這種需求。Serverless一系列產品生態可以讓用戶以業務爲導向,無需關心底層服務器部署以及承載能力,實施週期短,無預付價格按使用量付費。這些特性是適應互聯網5G快速時代、快速構建的不二選擇,爲企業節省成本的同時解決了技術上的難題。

以下面一個車聯網數據爲例子,我們來看一下如何用隊列服務來構建一個高可用高可靠的無服務應用。在車聯網應用中客戶端負載可能會在24小時內擴展/縮減3、4個數量級,這些特性天然適合Serverless服務動態擴縮,按量付費。

案例場景:車聯網中搭載數據收集傳感器的汽車向雲端傳輸行駛數據,雲端利用隊列服務削峯填谷、動態擴縮的能力接收數據,然後轉存到Elasticsearch進行更好的數據檢索和應用,爲用戶提供更好的服務或者爲公司提供更多的商業價值。
需求:隊列服務SDK,隊列服務接入點地址,Elasticsearch接入點地址(已經創建好ES實例),京東雲用戶AK/SK
代碼語言: Go

Step1

創建隊列服務客戶端以及資源創建

 func CreateClient() *sqs.SQS {
     ses, _ := session.NewSession(&aws.Config{
         Region: aws.String("cn-north-1"),
         Credentials: credentials.NewStaticCredentials("your AccessKey",
             "your SecretKey", ""),
         Endpoint:   aws.String("http://jqs.cn-north-1.jdcloud.com"),
         DisableSSL: aws.Bool(true),
     })
     _, err := ses.Config.Credentials.Get()
    if err != nil {
        log.Fatal("憑據創建失敗", err)
    }
    client := sqs.New(ses)
    return client
}

func CreateQueueTask(name string) string {
    resp, err := sqsClient.CreateQueue(&sqs.CreateQueueInput{
        QueueName: aws.String(name),
    })
    if err != nil {
        log.Println("Create Queue Failed:", err)
        return ""
    }
    return *resp.QueueUrl
}

Step2

每個車輛設備發送消息

 func SendTask(url string, message interface{}) {
    body, _ := json.Marshal(message)
     _, err := sqsClient.SendMessage(&sqs.SendMessageInput{
         MessageBody: aws.String(string(body)),
         QueueUrl:    aws.String(url),
     })
     if err != nil {
         log.Println("Send Message Failed:", err)
         return
    }
    return
}

測試數據

Alt

測試機器的配置:CPU64、內存256G、帶寬100Mbps(京東云云主機)

場景:公網;send-單條(JQS)

Step3

從隊列服務中拉取消息轉存到Elasticsearch中

func ReceiveMessageTask(url string) interface{} {
     result, err := sqsClient.ReceiveMessage(&sqs.ReceiveMessageInput{
         AttributeNames:        aws.StringSlice([]string{"All"}),
         MaxNumberOfMessages:   aws.Int64(1),
         MessageAttributeNames: aws.StringSlice([]string{"All"}),
         QueueUrl:              aws.String(url),
         VisibilityTimeout:     aws.Int64(30),
         WaitTimeSeconds:       aws.Int64(0),
     })
    log.Println(*result.Messages[0].Body)
    if err != nil {
        log.Println("Receive Message Failed:", err)
        return ""
    }

    if len(result.Messages) > 0 {
        _, delErr := sqsClient.DeleteMessage(&sqs.DeleteMessageInput{
            QueueUrl:      aws.String(url),
            ReceiptHandle: result.Messages[0].ReceiptHandle,
        })
        if err != nil {
            log.Println("Delete Message Failed:", delErr)
        }

        message := new(gpsMessage)
        Err := json.Unmarshal([]byte(*result.Messages[0].Body), message)
        if Err != nil {
            log.Println("Receive Message Unmarshal Failed", Err)
            return ""
        }
        return message
    }
    return ""
}

func Build(url string, method string, body interface{}) []byte {
    client := &http.Client{}
    //向服務端發送get請求
    bodyData, _ := json.Marshal(body)
    request, _ := http.NewRequest(method, url, bytes.NewReader(bodyData))

    request.Header.Set("Accept", "application/json")
    request.Header.Set("Content-Type", "application/json")
    //接收服務端返回給客戶端的信息
    response, _ := client.Do(request)
    r, _ := ioutil.ReadAll(response.Body)
    return r
}

func PostMessageToES(p string, body interface{}) string {
    postReturn := new(postRes)
    postResponse := Build(p, "POST", body)
    err := json.Unmarshal(postResponse, postReturn)
    if err != nil {
        log.Println("Unmarshal Failed", err)
    }
    jsonS, _ := json.Marshal(postReturn)
    log.Println("postResult:", string(jsonS))
    return postReturn.Id
}

Step4

從Elasticsearch按照需求索引搜索信息

func GetMessageFromES(p string) {
     message := new(esMessage)
     getResponse := Build(p, "GET", nil)
     log.Println("getPath:", p)
     Err := json.Unmarshal(getResponse, message)
     if Err != nil {
         log.Println("Unmarshal Failed", Err)
     }
     jsonM, _ := json.Marshal(message)
    log.Println("getResult:", string(jsonM))
}

結果示例

Alt
可以按照車輛信息進行數據的檢索,繪製出汽車動態地圖,利用這些數據來幫助自動駕駛、動態導航、車輛健康度分析等多種場景進行實現。

京東雲的隊列服務作爲Serverless開發中的BaaS服務,實現了中間件服務的無運維和毫秒級擴縮能力,支持京東雲的合作伙伴零成本啓動業務和按使用量付費的模式,幫助用戶解決資源擴縮和閾值監控等複雜問題。結合函數服務FaaS使用,可以滿足更豐富的場景,並且調用整個京東雲Serverless生態,打造基於雲原生21世紀的開放式的全新應用。點擊“瞭解”,快來進行體驗吧!

歡迎點擊“京東雲”瞭解更多精彩內容

Alt
Alt

發佈了162 篇原創文章 · 獲贊 60 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章