7 个版本
使用旧的 Rust 2015
0.2.10 | 2016年1月2日 |
---|---|
0.2.9 | 2015年11月14日 |
0.2.5 | 2015年10月30日 |
#7 in #ha
每月 32 次下载
2MB
35K SLoC
mesos-rs 🌐
为 Mesos v1 HTTP API 提供简单的绑定。SchedulerRouter 的默认特质路由到传统的 mesos 回调接口,但如果你愿意,可以提供自己的路由器实现来适应其他编程风格。本库的主要关注点是灵活性。
路线图
- 调度器
- 执行器
- ZK 主检测和故障转移
运行
[dependencies]
mesos = "0.2.10"
调度器
extern crate mesos;
use self::mesos::{Scheduler, SchedulerClient, SchedulerConf,
ProtobufCallbackRouter, run_protobuf_scheduler};
use self::mesos::proto::*;
use self::mesos::util;
struct TestScheduler {
max_id: u64,
}
impl TestScheduler {
fn get_id(&mut self) -> u64 {
self.max_id += 1;
self.max_id
}
}
impl Scheduler for TestScheduler {
fn subscribed(&mut self,
client: &SchedulerClient,
framework_id: &FrameworkID,
heartbeat_interval_seconds: Option<f64>) {
println!("received subscribed");
client.reconcile(vec![]);
}
// Inverse offers are only available with the HTTP API
// and are great for doing things like triggering
// replication with stateful services before the agent
// goes down for maintenance.
fn inverse_offers(&mut self,
client: &SchedulerClient,
inverse_offers: Vec<&InverseOffer>) {
println!("received inverse offers");
// this never lets go willingly
let offer_ids = inverse_offers.iter()
.map(|o| o.get_id().clone())
.collect();
client.decline(offer_ids, None);
}
fn offers(&mut self, client: &SchedulerClient, offers: Vec<&Offer>) {
// Offers are guaranteed to be for the same agent, and
// there will be at least one.
let agent_id = offers[0].get_agent_id();
println!("received {} offers from agent {}",
offers.len(),
agent_id.get_value());
let offer_ids: Vec<OfferID> = offers.iter()
.map(|o| o.get_id().clone())
.collect();
// get resources with whatever filters you need
let mut offer_cpus: f64 = offers.iter()
.flat_map(|o| o.get_resources())
.filter(|r| r.get_name() == "cpus")
.map(|c| c.get_scalar())
.fold(0f64, |acc, cpu_res| {
acc + cpu_res.get_value()
});
// or use this if you don't require special filtering
let mut offer_mem = util::get_scalar_resource_sum("mem", offers);
let mut tasks = vec![];
while offer_cpus >= 1f64 && offer_mem >= 128f64 {
let name = &*format!("sleepy-{}", self.get_id());
let task_id = util::task_id(name);
let mut command = CommandInfo::new();
command.set_value("env && sleep 10".to_string());
let mem = util::scalar("mem", "*", 128f64);
let cpus = util::scalar("cpus", "*", 1f64);
let resources = vec![mem, cpus];
let task_info = util::task_info(name,
&task_id,
agent_id,
&command,
resources);
tasks.push(task_info);
offer_cpus -= 1f64;
offer_mem -= 128f64;
}
client.launch(offer_ids, tasks, None);
}
fn rescind(&mut self, client: &SchedulerClient, offer_id: &OfferID) {
println!("received rescind");
}
fn update(&mut self, client: &SchedulerClient, status: &TaskStatus) {
println!("received update {:?} from {}",
status.get_state(),
status.get_task_id().get_value());
}
fn message(&mut self,
client: &SchedulerClient,
agent_id: &AgentID,
executor_id: &ExecutorID,
data: Vec<u8>) {
println!("received message");
}
fn failure(&mut self,
client: &SchedulerClient,
agent_id: Option<&AgentID>,
executor_id: Option<&ExecutorID>,
status: Option<i32>) {
println!("received failure");
}
fn error(&mut self, client: &SchedulerClient, message: String) {
println!("received error");
}
fn heartbeat(&mut self, client: &SchedulerClient) {
println!("received heartbeat");
}
fn disconnected(&mut self) {
println!("disconnected from scheduler");
}
}
fn main() {
let mut scheduler = TestScheduler { max_id: 0 };
let conf = SchedulerConf {
master_url: "https://127.0.0.1:5050".to_string(),
user: "root".to_string(),
name: "rust http".to_string(),
framework_timeout: 0f64,
implicit_acknowledgements: true,
framework_id: None,
};
// If you don't like the callback approach, you can implement
// an event router of your own. This is merely provided for
// those familiar with the mesos libraries in other languages.
let mut router = ProtobufCallbackRouter {
scheduler: &mut scheduler,
conf: conf.clone(),
};
run_protobuf_scheduler(&mut router, conf)
}
依赖关系
~8.5MB
~187K SLoC