簡體   English   中英

使用 Django 處理 OS 任務的 API 設計問題(REST 與 RPC)

[英]API Design Questions using Django for OS tasks (REST vs RPC)

背景:

我有一個應用程序,它應該自動化發生在網絡文件系統上的一些基礎設施和操作系統繁重的任務(例如:安裝卷、關閉/啟動服務器、創建目錄、移動數據、ssh-ing 等)。 最終,每個操作都需要按順序運行許多操作系統級別的命令。 我們的消費者/客戶可能不知道這個序列,但知道“我想做 X 任務”。

技術棧:Python/Django

我的任務是設置這個應用程序,但對從 API 角度和整體設計實現模塊化的最佳方法感到困惑。 目前,我們有一個類似的應用程序,它是 SOAP 樣式 (rpc),但它的編寫方式不是非常模塊化。 例如,一個函數將有大量隨機硬編碼的子進程命令——這不是我想在這里模擬的方法。

最初我更傾向於 REST API,因為 Django 有一個不錯的 django rest 框架插件,但是在建模這些非常面向動作的任務時遇到了麻煩。 我在網上閱讀的其他內容越多,我就越相信我真的需要將每一個小動作都視為一種資源,客戶端必須對每個小動作進行 GET/POST/PUT 操作以使事情變得非常模塊化,但是當我煮沸時再往下看,我可能需要為每種需要的情況設置 15 個以上的端點,並且客戶端可能不想調用所有 15 個端點來獲得他們想要的單一行為。 話雖如此 - 遷移到 rpc 以便用戶可以擁有一個“在一次調用中移動月球”的端點可能也不是最好的方法。

我認為我看到的問題之一是我們的應用程序在文件系統上做了很多工作,而不是全部包含在我們應用程序的數據庫中。 我認為這是這個應用程序的一個中心點,但是我在建模需要在我們的應用程序數據庫之外執行文件系統操作的事情時遇到了麻煩。

問題一:

我們的客戶端可能想要調用的一個示例操作是負責 ssh 到遠程服務器並運行命令。 您如何在 REST 中對此進行建模?

問題2:

你們如何在應用程序中對文件系統操作進行建模?

問題 3:

回顧以上內容后,RPC 似乎是更好的選擇嗎?

其他:

任何其他幫助或反饋(即使在一般情況下也非常感謝)。

REST 在某種意義上類似於 SOAP,您在 SOAP 中調用操作,而 REST 只是將這些操作映射到 Web 資源和 HTTP 方法。

例如

z DoSSHStuffOnARemoteServer(x=1,y=2)

對比

POST /RemoteServer/SSHStuff {x:1,y:2}

如果超時,因為它需要很多時間,那么你可以做

202 accepted
{type: "transaction": href: "/RemoteServer/SSHStuff/123", status: "pending"}

並每 5-10 分鍾輪詢一次,或使用 websockets 更新狀態。 完成后:

200 ok
{type: "transaction": href: "/RemoteServer/SSHStuff/123", status: "done", result: {z:3}}

所以沒有魔法。 請記住,REST 位於應用程序的表示層中,它返回視圖模型,並且如果您執行 DDD,則整個結構都連接到應用程序服務。 它不應該反映數據庫結構,除非你有一個貧乏的領域模型,或者其他人稱之為胖客戶端。 通常我不會說任何關於RemoteServer/SSHStuff的事情,只是告訴客戶將要做什么,並對如何完成保持沉默。 他們不需要知道您如何存儲數據或您擁有多少台服務器以及哪些協議和應用程序。 這不應該是他們關心的問題。 他們唯一需要知道將要做什么,需要多長時間才能做出反應以及會做出什么反應。 另一部分與他們無關,如果您共享太多,則會帶來安全風險。 當我們設計一個像 REST 服務的接口或 OOP 接口這樣的接口時,我們總是這樣做是為了隱藏實現細節。 希望對您有所幫助,祝您有美好的一天!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM