Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Облачная платформа
Cocaine - облако
своими рукаим
Антон Тюрин
разработчик облачной платформы
четверг, 13 июня 13 г.
Кокаин — это облачная платформа
четверг, 13 июня 13 г.
bit.ly/YaSubb-011212
Про Cocaine на Я.Субботнике
в Санкт-Петербурге в декабре 2012
Осторожно! С тех пор стало ещё лучше!
четверг, 13 июня 13 г.
Неуправляемые платформы
четверг, 13 июня 13 г.
+ Написать нужно только основную
логику.
Неуправляемые платформы
четверг, 13 июня 13 г.
+ Написать нужно только основную
логику.
+ Быстрая и дешёвая разработка.
Неуправляемые платформы
четверг, 13 июня 13 г.
+ Написать нужно только основную
логику.
+ Быстрая и дешёвая разработка.
– Ограничения в выборе инструментов.
Неуправляемые платформы
четверг, 13 июня 13 г.
+ Написать нужно только основную
логику.
+ Быстрая и дешёвая разработка.
– Ограничения в выборе инструментов.
– Нет контроля за окружением.
Неуправляемые платформы
четверг, 13 июня 13 г.
Управляемые платформы
четверг, 13 июня 13 г.
Управляемые платформы
+ Можно запустить почти всё что угодно.
четверг, 13 июня 13 г.
Управляемые платформы
+ Можно запустить почти всё что угодно.
+ Полный контроль над окружением.
четверг, 13 июня 13 г.
Управляемые платформы
+ Можно запустить почти всё что угодно.
+ Полный контроль над окружением.
– Нужно всё написать самому.
четверг, 13 июня 13 г.
Управляемые платформы
+ Можно запустить почти всё что угодно.
+ Полный контроль над окружением.
– Нужно всё написать самому.
– Полный цикл разработки.
четверг, 13 июня 13 г.
Cocaine Frameworks
четверг, 13 июня 13 г.
+ Асинхронный код.
Cocaine Frameworks
четверг, 13 июня 13 г.
+ Асинхронный код.
+ Грязная работа уже сделана.
Cocaine Frameworks
четверг, 13 июня 13 г.
+ Асинхронный код.
+ Грязная работа уже сделана.
+ Поддерживается Python, Node.js, C++.
Cocaine Frameworks
четверг, 13 июня 13 г.
+ Асинхронный код.
+ Грязная работа уже сделана.
+ Поддерживается Python, Node.js, C++.
– Нужно адаптировать существующий код.
Cocaine Frameworks
четверг, 13 июня 13 г.
Python
#!/usr/bin/env python
from cocaine.worker import Worker
W = Worker() # Dispatcher object
def event_handler(request, response):
req = yield request.read() # Read incoming data
if "Hello!" in req:
response.write("Hello, world!") # Send data chunk
else:
response.write("Please, say 'Hello' to me!")
response.close()
W.run({"hello" : event_handler}) # Run event loop.
bit.ly/YaSubb-dummy
четверг, 13 июня 13 г.
Node.js
#!/usr/bin/env node
var Q = require("q")
var co = require("..")
var argv = require("optimist").argv
var mp = require("msgpack")
var __assert = require("assert")
var crypto = require("crypto")
var W
co.getServices([],function(){
  
  var W = new co.Worker(argv)
  W.on("hash",function(stream){
    var sha512 = crypto.createHash("sha512")
    var request
    stream.on("data",function(data){ request = data
      sha512.update(data) })
    
    stream.on("end",function(){
      var d = sha512.digest("hex")
      stream.write(
        mp.pack({code:200,
                 headers:[ ["content-type","text/plain"], ["content-length",""+(d.length+1)],
                   ["x-by","worker"+argv.uuid]]}))
      stream.write(d+"n")
      stream.end()
    })
  })
  W.on("_terminate",function(){
    console.log("worker terminating")
    process.exit(0)
  })
})
четверг, 13 июня 13 г.
#include <fstream>
#include <functional>
#include <cocaine/framework/worker.hpp>
#include <cocaine/framework/application.hpp>
using namespace cocaine::framework;
class AppProxy : public application<AppProxy>
{
struct event_handler :
public handler<AppProxy>,
public std::enable_shared_from_this<event_handler>
{
event_handler(std::shared_ptr<AppProxy> a) : handler<AppProxy>(a) {
}
void
on_chunk(const char *chunk, size_t size) {
response()->write(chunk);
response()->close();
}
};
public:
AppProxy(std::shared_ptr<service_manager_t> service_manager) :
application<AppProxy>(service_manager) { }
void initialize() {
on<event_handler>("get");
}
};
int main(int argc, char *argv[])
{
cocaine::framework::worker_t::run<AppProxy>(argc, argv);
}
С++
четверг, 13 июня 13 г.
Драйверы
четверг, 13 июня 13 г.
Драйверы
четверг, 13 июня 13 г.
• Обычно, приложения — event driven.
Драйверы
четверг, 13 июня 13 г.
• Обычно, приложения — event driven.
• И единственное событие — HTTP-
запрос.
Драйверы
четверг, 13 июня 13 г.
You app
Драйверы
timeout
Timer
Driver
http-request
HTTP
Driver
file-changed
Filesystem
Driver
Cocaine
четверг, 13 июня 13 г.
You app
Драйверы
timeout
Timer
Driver
http-request
HTTP
Driver
Arduino
Driver?
file-changed
Filesystem
Driver
Cocaine
четверг, 13 июня 13 г.
You app
Драйверы
timeout
Timer
Driver
http-request
HTTP
Driver
wind-speed
Arduino
Driver?
file-changed
Filesystem
Driver
Cocaine
четверг, 13 июня 13 г.
{
"slave" : "dummy_with_drivers.py",
"drivers" : {
"A": {
"type": "filesystem-monitor",
"args": {
"emit": "file_changed",
"path": "/tmp/dummy-file"
}
},
"B": {
"type": "time",
"args": {
"emit": "wakeup",
"interval": 1000
}
}
}
}
Configure drivers
четверг, 13 июня 13 г.
Сервисы
четверг, 13 июня 13 г.
Сервисы
четверг, 13 июня 13 г.
• К общим компонентам — общий доступ.
Сервисы
четверг, 13 июня 13 г.
• К общим компонентам — общий доступ.
• Геолокация, логирование, определение
модели телефона, хранение данных, ...
Сервисы
четверг, 13 июня 13 г.
• К общим компонентам — общий доступ.
• Геолокация, логирование, определение
модели телефона, хранение данных, ...
• Для всех и без лишних задержек.
Сервисы
четверг, 13 июня 13 г.
• К общим компонентам — общий доступ.
• Геолокация, логирование, определение
модели телефона, хранение данных, ...
• Для всех и без лишних задержек.
• Не надо писать биндинг в каждый язык
Сервисы
четверг, 13 июня 13 г.
Сервисы
Geolocation
Logging
URL Fetching
MapReduce
RPC
App #1 Worker
App #1 Worker
App #2 Worker
App #2 Worker
Cocaine
четверг, 13 июня 13 г.
#!/usr/bin/env python
from cocaine.worker import Worker
from cocaine.services import Service
storage = Service("storage")
def write_dummy(request, response):
req = yield request.read()
yield storage.write("dummy-namespace", "dummy-key",
req , ["dummy-tag"])
dummy = yield storage.read("dummy-namespace", "dummy-key")
response.write(dummy)
response.close()
W = Worker()
W.run({"write_dummy" : write_dummy})
Python bit.ly/YaSubb-cocaine-service
четверг, 13 июня 13 г.
Протокол
четверг, 13 июня 13 г.
Взаимодействие
четверг, 13 июня 13 г.
• Сервисы, приложения, ядро - общаются
по одному протоколу.
Взаимодействие
четверг, 13 июня 13 г.
• Сервисы, приложения, ядро - общаются
по одному протоколу.
• Простой - состоит из 7 команд.
Взаимодействие
четверг, 13 июня 13 г.
• Сервисы, приложения, ядро - общаются
по одному протоколу.
• Простой - состоит из 7 команд.
• Поддерживает стриминг.
Взаимодействие
четверг, 13 июня 13 г.
[1, 0, [ arg1, arg2 ]]
номер канала
код команды
специфичные для команды
данные
четверг, 13 июня 13 г.
Команды
• heartbeat
• handshake
• terminate
• error
• invoke
• chunk
• choke
четверг, 13 июня 13 г.
Cocaine-Runtime
четверг, 13 июня 13 г.
Cocaine-Runtime
четверг, 13 июня 13 г.
Cocaine-Runtime
• Управляет количеством воркеров
четверг, 13 июня 13 г.
Cocaine-Runtime
• Управляет количеством воркеров
• Запускает сервисы
четверг, 13 июня 13 г.
Cocaine-Runtime
• Управляет количеством воркеров
• Запускает сервисы
• Собирает статистику о других runtime
четверг, 13 июня 13 г.
Cocaine-Runtime
• Управляет количеством воркеров
• Запускает сервисы
• Собирает статистику о других runtime
• Предоставляет локатор сервисов
четверг, 13 июня 13 г.
Cocaine-Runtime
• Управляет количеством воркеров
• Запускает сервисы
• Собирает статистику о других runtime
• Предоставляет локатор сервисов
• Загружает драйверы
четверг, 13 июня 13 г.
Cocaine-tool
четверг, 13 июня 13 г.
Cocaine-tool
• Управление приложениями в облаке
• Информация о состоянии облака
• Для тех, кто не боится командной
строки
четверг, 13 июня 13 г.
service cocaine-runtime start
• Стартуют сервисы
• Создаются сокеты для воркеров
• Инициализируются данные для приложений
четверг, 13 июня 13 г.
service cocaine-runtime start
Cocaine
Runtime
• Стартуют сервисы
• Создаются сокеты для воркеров
• Инициализируются данные для приложений
четверг, 13 июня 13 г.
service cocaine-runtime start
Cocaine
Runtime
Service Node
Service Locator
Other services
• Стартуют сервисы
• Создаются сокеты для воркеров
• Инициализируются данные для приложений
четверг, 13 июня 13 г.
service cocaine-runtime start
Cocaine
Runtime
UDS for appB
Service Node
Service Locator
Other services
• Стартуют сервисы
• Создаются сокеты для воркеров
• Инициализируются данные для приложений
четверг, 13 июня 13 г.
service cocaine-runtime start
Cocaine
Runtime
UDS for appBUDS for appA
Service Node
Service Locator
Other services
• Стартуют сервисы
• Создаются сокеты для воркеров
• Инициализируются данные для приложений
четверг, 13 июня 13 г.
Рождение
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
• Запускает worker
• Ждет handshake от worker’а
• Worker стартует и шлет handshake
четверг, 13 июня 13 г.
Рождение
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
first event for appA
• Запускает worker
• Ждет handshake от worker’а
• Worker стартует и шлет handshake
четверг, 13 июня 13 г.
Рождение
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
first event for appA
worker
for A
fork & exec slave --uuid <uuid> --endpoint <UDS>
runtime ждет handshake
• Запускает worker
• Ждет handshake от worker’а
• Worker стартует и шлет handshake
четверг, 13 июня 13 г.
Рождение
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
first event for appA
handshake
with uuid
worker
for A
fork & exec slave --uuid <uuid> --endpoint <UDS>
runtime ждет handshake
• Запускает worker
• Ждет handshake от worker’а
• Worker стартует и шлет handshake
четверг, 13 июня 13 г.
Сессия
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
worker
for A
четверг, 13 июня 13 г.
Сессия
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
worker
for A
четверг, 13 июня 13 г.
Сессия
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
worker
for A
четверг, 13 июня 13 г.
Сессия
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
worker
for A
service endpoint
четверг, 13 июня 13 г.
Сессия
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
worker
for A
service endpoint
Service storage
another CR node
четверг, 13 июня 13 г.
Сессия
Cocaine
RuntimeUDS for appA UDS for appB
Service Node
Service Locator
Other services
worker
for A
service endpoint
Service storage
another CR node
четверг, 13 июня 13 г.
- Да, наверняка ничего не
работает!
- Сейчас покажу!
bitly.com/iwantcoke
четверг, 13 июня 13 г.
Модули
четверг, 13 июня 13 г.
Модули
четверг, 13 июня 13 г.
• Всё, кроме ядра системы —
подключаемые модули.
Модули
четверг, 13 июня 13 г.
• Всё, кроме ядра системы —
подключаемые модули.
• Драйверы, изоляторы, сервисы,
стораджи, системы логирования.
Модули
четверг, 13 июня 13 г.
• Всё, кроме ядра системы —
подключаемые модули.
• Драйверы, изоляторы, сервисы,
стораджи, системы логирования.
• И их можно менять в рантайме.
Модули
четверг, 13 июня 13 г.
• Essentials
• Blastbeat Driver
• CGroups Isolation
• MongoDB Storage
• Elliptics Storage
• URLFetch Service
Open Source
четверг, 13 июня 13 г.
noxiouz@yandex.ru
@Noxi0uz
Спасибо
Разработчик облачной
платформы
Антон Тюрин
четверг, 13 июня 13 г.

More Related Content

Антон Тюрин — Облачная платформа Cocaine — облако своими руками