Prezi

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in the manual

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

OnetPoczta

Wysoko skalowalne serwisy pythonowe w OnetPoczcie
by Igor Waligóra on 28 February 2014

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of OnetPoczta

PyConPL 2012
Onet Poczta
OnetPoczta
OnetPoczta
Python w Onecie
Serwisy
Zarządzanie wdrożeniami
Tworzenie i konfiguracja maszyn w chmurze
Ponad 70 osób aktywnie pracuje w Pythonie

Pytania i odpowiedzi
Jak Pracujemy
Scrum
DevOps
Zespoły produktowe

Wyzwanie
Model rozproszenia usług
Integracja podsystemów
Eksporty bibliotek
Wyzwania
200 serwerów
20 mln wiadomości dziennie
1 PB wolumenu danych
4,7 mln aktywych użytkowników
80 tys. odwołań na minutę
spam
MParser
Serwer asynchroniczny - Tornado
JSON-RPC
Biblioteka kliencka w C
Biblioteka w Pythonie?
libOP - API OnetPoczty
libAUTH
libDB
libMPARSER
libSTORAGE
libANTYSPAM
Eksport bibliotek
libOCACHE
Wdrażanie
Paczkowanie bibliotek - dpkg
PyPI
kompilacja rozszerzeń
zależności
Virtualenv
niezależne aplikacje
zautomatyzowane wdrażanie
Wydajność
czas dostarczenia poniżej 1s
uptime na poziomie 99,80%
500 tys. odrzucanego spamu na minutę
op.c
op.h
op.pyx
op.pxd
op.py
/* op.c */

int
mparser_fetch(const struct mparser_server *mparser,
const struct mparser_fetch_from_file_in* inp,
struct mparser_out* outp)
{



[...]



}
SMTP
POP3/IMAP
WEBMAIL
Storage
Bazy danych
Pliki
Serwery plików
Zapis
Odczyt
Parsowanie RFC822
SMTP
Postfix
MDA
Storage
POP3 / IMAP
Dovecot
Storage
PHP / JavaScript
Pythonowe serwisy
Storage
Webmail
Wdrażanie
$ dpkg -i libop_1.1.0_amd64.deb

$ mkvirtualenv mparser
(mparser)$ pip install mparser

$ cat ~/.pip/pip.conf
[global]
timeout = 10
index-url = http://pypi.onet/simple
Podsumowanie
Skalowanie systemu
Niskopoziomowe biblioteki
Eksport bibliotek w C
Integracja systemu
/* op.h */

struct mparser_server {
[...]
};

struct mparser_out {
[...]
};

struct mparser_fetch_in {
[...]
};

int mparser_fetch(const struct server *mparser,
const struct mparser_fetch_in* inp,
struct mparser_out* outp) {
[...]
};
# c_op.pxd

cdef extern from "op.h":
cdef struct mparser_out:
char *content
[...]
int mparser_fetch_from_file(
const struct mparser_server *mparser,
const struct mparser_fetch_file_in* inp,
struct mparser_out* outp)

/* op.pxd */
from op.c_op cimport *

cdef class MParser(object):
cdef public _mparser_host

cdef object _make_dict_from_result(MParser self,
mparser_out *c_result,
unsigned int content_mask)
[...]
# op.pyx

cdef class MParser(object):

def parse_message(MParser self, message_path,
content_types=None):
cdef:
mparser_out c_result

error = mparser_fetch(&c_result)
result = self._make_dict_from_result(&c_result)
return result

cdef object _make_dict_from_result(MParser self,
mparser_out *c_result):
result = {}
result['content'] = c_result.content.decode('utf-8')
[...]
return result
# op_example.py

from op import MParser

content_mask = [CONTENT, SUBJECT, FROM, SIZE]

mp = MParser('mparser', 32222, None)
result = mp.parse_message('file_storageN.onet', '/tmp/mail_file',
content_mask)

#result = {'content': 'Plain text message content',
# 'subject': 'Test message subject',
# 'from': 'igor@example.com',
# 'size': 6789}
http://www.cython.org/
it.blog.onet.pl
# setup.py

from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
[...],
cmdclass = {'build_ext': build_ext},
ext_modules=[
Extension("op.mparser", ["op.pyx"],
include_dirs=['/usr/include'],
library_dirs=[],
libraries=['nap'],
extra_compile_args=['-O2'],
extra_link_args = ['-g']),
],
[...],
)
setup.py
Cython
Zalety eksportów
Jedna implementacja
Wygoda tworzenia testów
Optymalizacja
parsowanie maila ponad 20x szybsze
LVS
A1
A2
A4
A3
An
switch
DB1
DB2
DBn
DB3
DB4
STG1
STG2
STG3
STG4
STGn
See the full transcript