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

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

Jun 22, 2015

Download

Documents

CodeFest
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CodeFest 2012. Евтухович И. — Как мы делали Групон

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

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

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

План доклада

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

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

Групон

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

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

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

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

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

Ruby

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

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

Примеры кода

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

> [1, 4, 9 …]

a = "conference"

def a.name

"CodeFest"

end

a.name # > CodeFest

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

Ruby On Rails

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

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

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

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

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

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

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

История №1

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

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

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

История №2

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

История №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))

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

История №4

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

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

Frontend

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

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

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

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

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

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

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

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

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

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

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

● Basecamp● Zendesk● Skype

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

Только Skype

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

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

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

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

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

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

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

Выкатка

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

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

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

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

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

● cobbler● vagrant● OBS● Opscode hosted chef

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

Мониторинг

● airbrake (hoptoad)● newrelic● zabbix

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

Вклад в Open Source

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

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

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

https://github.com/evilmartians/zendesk

zendesk

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

cupid

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

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

SOAP интерфейс

к ExactTarget

https://github.com/evilmartians/cupid

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

gon

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

https://github.com/gazay/gon

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

visibility.js

Visibility.every(1000, function () {

updateCountdownAnimation();

});

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

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

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

role

Саша Косс

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

А потом

$('@role_name').something()

https://github.com/kossnocorp/role

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

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

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

Вопросы?

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