40
Как мы делали Групон Иван Евтухович

CodeFest 2012. Евтухович И. — Как мы делали Групон

Embed Size (px)

Citation preview

Как мы делали Групон

Иван Евтухович

План доклада

● Немного про ruby и rails● Архитектура groupon.ru● Организация командной работы● Управление конфигурацией● Вклад в Open Source

Групон

● Простая бизнес-модель● Сайт из трех страниц

Шутки в сторону

● ~75000 строк кода● Более 10 миллионов пользователей● Десятки миллионов запросов в день

Ruby

● Динамический● Объектно-ориентированный● Поддерживает замыкания● Лаконичный синтаксис● 3 реализации (MRI, JRuby, Rubinius)

Примеры кода

(1..100).to_a.map { |e| e*e }

> [1, 4, 9 …]

a = "conference"

def a.name

"CodeFest"

end

a.name # > CodeFest

Ruby On Rails

● MVC фреймворк● REST● ORM (ActiveRecord)● Rubygems (35 тысяч гемов)● Bundler

Архитектура Групона

● debian Squeeze 6.0.3● ruby● rails 2.3 3.0● unicorn● delayed_job

● postgresql 9.0 9.1● nginx● memcached● newrelic● chef

История №1

codes(id, code, group_name, coupon_id)

SELECT *FROM codesWHERE group_name = 'skype' AND coupon_id IS NULLORDER BY idLIMIT 1

CREATE INDEX ON code(group_name, id)WHERE coupon_id IS NULL

История №2

История №3

class User < ActiveRecord::Base

validates_uniqueness_of :email,

:case_sensitive => false

end

SELECT "users".id FROM "users"

WHERE (LOWER("users"."email") = '[email protected]' AND "users".id <> 12345) LIMIT 1

CREATE INDEX on users(lower(email))

История №4

Переезд на новый сервер БД● 48 Gb → 192 Gb● 9.0 → 9.1● репликация● pg_upgrade● ANALYZE

Frontend

● Sass● Compass● JQuery 1.6.4● CoffeeScript● barista● uglifier● jammit

Внешние сервисы

● Защита от DDOS● Zendesk● Exact target

Организация командной работы

Распределенная команда

● Москва● Санкт-Петербург● Омск● Одесса● Владивосток● Тайланд/Бали/Китай

Коммуникация

● Basecamp● Zendesk● Skype

Только Skype

● Общий контекст● Концетрация на изменениях● Skype-bot

Банальные истины

● Уровень доверия влияет● Наказания тормозят разработку● Не работайте с лентяями

Выкатка и управление конфигурацией

Выкатка

● capistrano● через Skype-bot● идет всегда (почти каждый коммит)● A/B - норма

● мертвый код - зло● выкатывайте часто● автоматизируйте всё● проверяйте rollback● большие выкатки надо тренировать

Управление конфигурацией

● cobbler● vagrant● OBS● Opscode hosted chef

Мониторинг

● airbrake (hoptoad)● newrelic● zabbix

Вклад в Open Source

Андрей Дерябин

ruby-обертка надо API сервиса zendesk

https://github.com/evilmartians/zendesk

zendesk

cupid

Алексей Газиев

Равиль Байрамгалин

SOAP интерфейс

к ExactTarget

https://github.com/evilmartians/cupid

gon

Алексей Газиев

https://github.com/gazay/gon

visibility.js

Visibility.every(1000, function () {

updateCountdownAnimation();

});

https://github.com/evilmartians/visibility.js

Андрей Ситник

role

Саша Косс

<div role="role_name"></div>

А потом

$('@role_name').something()

https://github.com/kossnocorp/role

Почти у всех есть коммиты в rails

Вопросы?

[email protected]: evtuhovichhttp://blog.evtuhovich.ru