SWIM Rust SDK berisi kerangka kerja perangkat lunak untuk membangun aplikasi stateful yang dapat berinteraksi dengan melalui API streaming multiplex. Ini dibangun di atas runtime asinkron Tokio dan runtime Tokio diperlukan untuk aplikasi berenang apa pun.
Setiap aplikasi terdiri dari sejumlah agen stateful, yang masing -masing berjalan sebagai tugas TOKIO terpisah dan dapat secara individual ditangani oleh URI. Agen mungkin memiliki negara bagian dan swasta yang dapat disimpan semata -mata dalam memori atau, secara opsional, dalam penyimpanan persisten. Keadaan publik agen terdiri dari sejumlah jalur, analog dengan bidang dalam sebuah catatan. Ada beberapa jenis jalur yang, misalnya, jalur yang mengandung nilai tunggal dan yang berisi peta pasangan nilai kunci.
Keadaan jalur apa pun dapat diamati dengan membuat tautan ke sana (baik dari instance agen lain atau klien khusus). Tautan yang ditetapkan akan mendorong semua pembaruan ke keadaan jalur itu ke pelanggan dan juga akan memungkinkan pelanggan untuk meminta perubahan ke negara (untuk jenis jalur yang mendukung ini). Tautan beroperasi melalui koneksi web-socket dan multiplexed, artinya tautan ke beberapa jalur pada host yang sama dapat berbagi koneksi web-soket tunggal.
Situs web | Panduan Pengembang | Dokumen API Server | Dokumen API Klien
Menerapkan agen berenang di Rust
Membangun Aplikasi Server Berenang
Dokumentasi referensi
Contoh aplikasi berikut menjalankan server Swimos yang meng -host rute agen tunggal di mana setiap instance agen memiliki jalur tunggal, yang disebut lane . Setiap kali perubahan dilakukan ke jalur, itu akan dicetak di konsol oleh server.
[ dependencies ]
swimos = { version = " 0.1.1 " , features = [ " server " , " agent " ] } use swimos :: {
agent :: {
agent_lifecycle :: HandlerContext ,
agent_model :: AgentModel ,
event_handler :: { EventHandler , HandlerActionExt } ,
lanes :: ValueLane ,
lifecycle , AgentLaneModel ,
} ,
route :: RoutePattern ,
server :: { until_termination , Server , ServerBuilder } ,
} ;
# [ tokio :: main ]
pub async fn main ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
// An agent route consists of the agent definition and a lifecycle.
let model = AgentModel :: new ( ExampleAgent :: default , ExampleLifecycle . into_lifecycle ( ) ) ;
let server = ServerBuilder :: with_plane_name ( "Example Plane" )
. set_bind_addr ( "127.0.0.1:8080" . parse ( ) ? ) // Bind the server to this address.
. add_route ( RoutePattern :: parse_str ( "/examples/{id}" ) ? , model ) // Register the agent we have defined.
. build ( )
. await ? ;
// Run the server until we terminate it with Ctrl-C.
let ( task , handle ) = server . run ( ) ;
let ( ctrl_c_result , server_result ) = tokio :: join! ( until_termination ( handle , None ) , task ) ;
ctrl_c_result? ;
server_result? ;
Ok ( ( ) )
}
// Deriving the `AgentLaneModel` trait makes this type into an agent.
# [ derive ( AgentLaneModel ) ]
struct ExampleAgent {
lane : ValueLane < i32 > ,
}
// Any agent type can have any number of lifecycles defined for it. A lifecycle describes
// how the agent will react to events that occur as it executes.
# [ derive ( Default , Clone , Copy ) ]
struct ExampleLifecycle ;
// The `lifecycle` macro creates an method called `into_lifecycle` for the type, using the
// annotated event handlers methods in the block.
# [ lifecycle ( ExampleAgent ) ]
impl ExampleLifecycle {
# [ on_event ( lane ) ]
fn lane_event (
& self ,
context : HandlerContext < ExampleAgent > ,
value : & i32 ,
) -> impl EventHandler < ExampleAgent > {
let n = * value ;
context . get_agent_uri ( ) . and_then ( move |uri| {
context . effect ( move || {
println ! ( "Received value: {} for 'lane' on agent at URI: {}." , n , uri ) ;
} )
} )
}
} Misalnya, jika klien berenang mengirim pembaruan, dengan nilai 5 , ke agen di URI /examples/name untuk lane jalur, contoh dari ExampleAgent , menggunakan ExampleLifecycle , akan dimulai oleh server. Nilai jalur kemudian akan ditetapkan ke 5 dan berikut ini akan dicetak pada konsol:
Received value: 5 for 'lane' on agent at URI: /examples/name.
Sejumlah contoh aplikasi tersedia di direktori contoh_apps yang menunjukkan fitur individu serta aplikasi yang lebih komprehensif.
Lihat Panduan Pengembangan.
Proyek ini dilisensikan di bawah lisensi Apache 2.0.