Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Utiliser les classes modèles de dja ngo en asyncrone

#1 25-07-2012 10:37:02

Christophe, Jean-Charles Narbonne
Membre
Inscription : 23-06-2011
Messages : 30

Utiliser les classes modèles de dja ngo en asyncrone

Bonjour,

Pour mes application temps réel, je complète django avec tornado qui a son
moteur d'évènements. Ma difficultée est que je n'accède à mes données que
par l'orm de django et notification entre mon serveur django et mon serveur
tornado. Pour l'instant, pour limiter les accès bloquants, je charge les
dernières données au lancement du serveur tornado (pas génant qu'il y ait
une procédure bloquante à ce moment) puis je la tien en mémoire sous forme
de listes python. (plus exactement un dictionnaire de listes qui sont
gérées comme des queues FILO).

Ce que je ne trouve pas et que je cherche c'est un moyen d'avoir un mixin
ou un monkeypatch pour mes modèles django pour que les appels db soient
asyncrones.

En espérant une piste car la gestion en mémoire des queues me limite à un
seul process.

Note: mon serveur django utilise déjà celery et dans les pistes que je n'ai
pas exclues mais que je trouverai domage car redondente avec ce service, ce
serait d'utiliser zmq (ou pika) pour toutes les taches faisant un accès db.
puis utiliser un autre broker unique pour gérer en mémoire mes queues ce
qui permetrait de répartir après le service tornado sur plusieur process.

Après, j'ai pas non plus envie de faire de l'over engeneering...

Si vous aves des suggestions.

Hors ligne

#2 25-07-2012 10:53:57

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Utiliser les classes modèles de dja ngo en asyncrone

Je ne connais pas de moyen de rendre l'ORM Django asyncrone, mais nous avons la même problématique que vous et nous l'avons résolu en encaspulant systématiquement les opérations blocantes dans une task celery.

Par exemple, une des tâches pour écrire dans la base de donnée ressemble à:

from django.db import models
from celery import task

@task
def update_model(app, model, filters, ,values):

     model = models.get_model(app, model)
     model.objects.filters(**filters).update(**values)

Et dans le code que l'on veut non bloquant:

import datetime
from tasks import update_model

# update tous les models créés avant aujourd'hui
update_model.apply_async(['ma_super_app', 'MonSuperModel', {(created_date__lt': datetime.datetime.now()}, {'super_attribut': 'nouvelle_valeur'}])

Ce n'est pas super DRY, mais c'est simple et ça fait le boulot.

Hors ligne

#3 25-07-2012 11:39:44

Christophe, Jean-Charles Narbonne
Membre
Inscription : 23-06-2011
Messages : 30

Re : Utiliser les classes modèles de dja ngo en asyncrone

Merci Kevin Samuel de ta réponse,

Néanmoins, dans mon cas, je cherche plus à monter des informations en temps
réel et je pensais formuler une requete pour lire mais en effet, comme le
set de models sont géré principalement par l'application tornado, si mes
informations récentes sont toutes en ram quand elle montent, je peux
reporter l'écriture.

Je cherchais un truc plus souple qui permette de lire mais c'est vrai que
cette méthode doit pouvoir faire l'affaire.

Utiliser pika au lieu de celery pour accéder directement à rabbitmq me
ferme la porte de changer de backend plus tard mais doit permettre à
tornado d'être à la fois producer et consumer. (à l'heure actuelle mon
service django fait des requettes http avec urllib2 pour notifier tornado)

Merci pour ta tache de modification de modele générique.

J'hésite maintenant entre 3 pistes:

   - celery dans tornado (pas intégré ac le réacteur mais si on utilise
l'async pour de l'écriture simple c'est probablement jouable)
   - pika: plus de code et de recherche nécessaire mais plus souple
   - zmq: plus de risques de notifications droppées mais ce qu'il y a de
plus souple et un peu plus simple que pika. Néanmoins, cette solution
implique que je lance encore des services complémentaires, or je dépends
déjà de bcps de services ^^. (tornado, celeryd, celerybeat, django, un
serveur twisted pour remontées par socket de périphériques embarqués...)


2012/7/25 Kevin Samuel <kevsamuel _AT_ myopera.com>

> Je ne connais pas de moyen de rendre l'ORM Django asyncrone, mais nous
> avons la même problématique que vous et nous l'avons résolu en
> encaspulant systématiquement les opérations blocantes dans une task
> celery.
>
> Par exemple, une des tâches pour écrire dans la base de donnée
> ressemble à:
>
>

from django.db import models
> from celery import task
>
> @task
> def update_model(app, model, filters, ,values):
>
>      model = models.get_model(app, model)
>      model.objects.filters(**filters).update(**values)

>
> Et dans le code que l'on veut non bloquant:
>

> import datetime
> from tasks import update_model
>
> # update tous les models créés avant aujourd'hui
> update_model.apply_async(['ma_super_app', 'MonSuperModel',
> {(created_date__lt': datetime.datetime.now()}, {'super_attribut':
> 'nouvelle_valeur'}])

>
> Ce n'est pas super DRY, mais c'est simple et ça fait le boulot.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 25-07-2012 12:04:59

Chamal
Membre
Inscription : 11-08-2010
Messages : 17

Re : Utiliser les classes modèles de dja ngo en asyncrone

Le 25 juil. 2012 à 11:37, Christophe Narbonne a écrit :

> Bonjour,
>
> Pour mes application temps réel, je complète django avec tornado qui a son moteur d'évènements. Ma difficultée est que je n'accède à mes données que par l'orm de django et notification entre mon serveur django et mon serveur tornado. Pour l'instant, pour limiter les accès bloquants, je charge les dernières données au lancement du serveur tornado (pas génant qu'il y ait une procédure bloquante à ce moment) puis je la tien en mémoire sous forme de listes python. (plus exactement un dictionnaire de listes qui sont gérées comme des queues FILO).
>
> Ce que je ne trouve pas et que je cherche c'est un moyen d'avoir un mixin ou un monkeypatch pour mes modèles django pour que les appels db soient asyncrones.

Hello,

C'est le driver DB qu'il faut changer pour en mettre une version gérant les sockets en asynchrone.

La lib mysql en C utilisée par MysqlDB n'est par exemple pas du tout asynchrone, le monkey patch ne
peut fonctionner.

psycopg2 a un mode async possible, mais j'ai jamais expérimenté et ne peut en dire plus.

>
> En espérant une piste car la gestion en mémoire des queues me limite à un seul process.

Utiliser un système de cache memcached / redis (avec les inconvénients a bien le gérer)
partagé entre Django (qui rafraichit le cache) et Tornado.

La gestion async d'un tel composant étant bien plus évidente qu'une DB. Par contre c'est
un composant supplémentaire dans l'architecture, ce n'est peut être pas souhaité.

>
> Note: mon serveur django utilise déjà celery et dans les pistes que je n'ai pas exclues mais que je trouverai domage car redondente avec ce service, ce serait d'utiliser zmq (ou pika) pour toutes les taches faisant un accès db. puis utiliser un autre broker unique pour gérer en mémoire mes queues ce qui permetrait de répartir après le service tornado sur plusieur process.

pour de l'async sur de l'AMQP je préconise plutôt puka que pika. Il est dommage que la version récente de pika ne soit plus compatible avec kombu (composant bas niveau de celery pour la gestion des
différents protocoles de message queuing).

> Après, j'ai pas non plus envie de faire de l'over engeneering...


++ Aymeric

Hors ligne

#5 25-07-2012 12:58:28

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Utiliser les classes modèles de dja ngo en asyncrone

+1 pour utiliser redis comme moyen de sync entre tous les dispositifs:
très rapide, atomique, persistent.

Le mer. 25 juil. 2012 13:04:59 CEST, Aymeric Barantal a écrit :
>
> Le 25 juil. 2012 à 11:37, Christophe Narbonne a écrit :
>
>> Bonjour,
>>
>> Pour mes application temps réel, je complète django avec tornado qui a son moteur d'évènements. Ma difficultée est que je n'accède à mes données que par l'orm de django et notification entre mon serveur django et mon serveur tornado. Pour l'instant, pour limiter les accès bloquants, je charge les dernières données au lancement du serveur tornado (pas génant qu'il y ait une procédure bloquante à ce moment) puis je la tien en mémoire sous forme de listes python. (plus exactement un dictionnaire de listes qui sont gérées comme des queues FILO).
>>
>> Ce que je ne trouve pas et que je cherche c'est un moyen d'avoir un mixin ou un monkeypatch pour mes modèles django pour que les appels db soient asyncrones.
>
> Hello,
>
> C'est le driver DB qu'il faut changer pour en mettre une version gérant les sockets en asynchrone.
>
> La lib mysql en C utilisée par MysqlDB n'est par exemple pas du tout asynchrone, le monkey patch ne
> peut fonctionner.
>
> psycopg2 a un mode async possible, mais j'ai jamais expérimenté et ne peut en dire plus.
>
>>
>> En espérant une piste car la gestion en mémoire des queues me limite à un seul process.
>
> Utiliser un système de cache memcached / redis (avec les inconvénients a bien le gérer)
> partagé entre Django (qui rafraichit le cache) et Tornado.
>
> La gestion async d'un tel composant étant bien plus évidente qu'une DB. Par contre c'est
> un composant supplémentaire dans l'architecture, ce n'est peut être pas souhaité.
>
>>
>> Note: mon serveur django utilise déjà celery et dans les pistes que je n'ai pas exclues mais que je trouverai domage car redondente avec ce service, ce serait d'utiliser zmq (ou pika) pour toutes les taches faisant un accès db. puis utiliser un autre broker unique pour gérer en mémoire mes queues ce qui permetrait de répartir après le service tornado sur plusieur process.
>
> pour de l'async sur de l'AMQP je préconise plutôt puka que pika. Il est dommage que la version récente de pika ne soit plus compatible avec kombu (composant bas niveau de celery pour la gestion des
> différents protocoles de message queuing).
>
>> Après, j'ai pas non plus envie de faire de l'over engeneering...
>
>
> ++ Aymeric
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#6 25-07-2012 15:48:58

Christophe, Jean-Charles Narbonne
Membre
Inscription : 23-06-2011
Messages : 30

Re : Utiliser les classes modèles de dja ngo en asyncrone

Même si c'est certainement pas optimal, je n'ai pas envie de gérer une
historisation complète dans redis dans la mesure ou out est copier en ram
indéfiniement et que j'aimerai virer les éléments vieux de la ram et les
garder juste pour de la consultation occasionnelle.

Je pense que ce sont des serveurs et au final, maintenant, je me demande si
j'ai vraiment besoin d'un programe intermédiaire pour les faire discuter.
Tornado a un client http asyncrone et faire un webservice même si ce n'est
pas optimal doit être plus simple en terme d'architechture.

http://www.tornadoweb.org/documentation/httpclient.html

Merci de votre aide, Redis aurai pu être une très bonne solution notament
en terme de performance brute et ça n'aurai pas couté de service en plus en
substituant rabbitmq.

Cordialement, Christophe.

2012/7/25 Kevin Samuel <kevsamuel _AT_ myopera.com>

> +1 pour utiliser redis comme moyen de sync entre tous les dispositifs:
> très rapide, atomique, persistent.
>
> Le mer. 25 juil. 2012 13:04:59 CEST, Aymeric Barantal a écrit :
> >
> > Le 25 juil. 2012 à 11:37, Christophe Narbonne a écrit :
> >
> >> Bonjour,
> >>
> >> Pour mes application temps réel, je complète django avec tornado qui a
> son moteur d'évènements. Ma difficultée est que je n'accède à mes données
> que par l'orm de django et notification entre mon serveur django et mon
> serveur tornado. Pour l'instant, pour limiter les accès bloquants, je
> charge les dernières données au lancement du serveur tornado (pas génant
> qu'il y ait une procédure bloquante à ce moment) puis je la tien en mémoire
> sous forme de listes python. (plus exactement un dictionnaire de listes qui
> sont gérées comme des queues FILO).
> >>
> >> Ce que je ne trouve pas et que je cherche c'est un moyen d'avoir un
> mixin ou un monkeypatch pour mes modèles django pour que les appels db
> soient asyncrones.
> >
> > Hello,
> >
> > C'est le driver DB qu'il faut changer pour en mettre une version gérant
> les sockets en asynchrone.
> >
> > La lib mysql en C utilisée par MysqlDB n'est par exemple pas du tout
> asynchrone, le monkey patch ne
> > peut fonctionner.
> >
> > psycopg2 a un mode async possible, mais j'ai jamais expérimenté et ne
> peut en dire plus.
> >
> >>
> >> En espérant une piste car la gestion en mémoire des queues me limite à
> un seul process.
> >
> > Utiliser un système de cache memcached / redis (avec les inconvénients a
> bien le gérer)
> > partagé entre Django (qui rafraichit le cache) et Tornado.
> >
> > La gestion async d'un tel composant étant bien plus évidente qu'une DB.
> Par contre c'est
> > un composant supplémentaire dans l'architecture, ce n'est peut être pas
> souhaité.
> >
> >>
> >> Note: mon serveur django utilise déjà celery et dans les pistes que je
> n'ai pas exclues mais que je trouverai domage car redondente avec ce
> service, ce serait d'utiliser zmq (ou pika) pour toutes les taches faisant
> un accès db. puis utiliser un autre broker unique pour gérer en mémoire mes
> queues ce qui permetrait de répartir après le service tornado sur plusieur
> process.
> >
> > pour de l'async sur de l'AMQP je préconise plutôt puka que pika. Il est
> dommage que la version récente de pika ne soit plus compatible avec kombu
> (composant bas niveau de celery pour la gestion des
> > différents protocoles de message queuing).
> >
> >> Après, j'ai pas non plus envie de faire de l'over engeneering...
> >
> >
> > ++ Aymeric
> >
> > _______________________________________________
> > django mailing list
> > django _AT_ lists.afpy.org
> > http://lists.afpy.org/mailman/listinfo/django
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

  • Accueil
  • » Django-fr
  • » Utiliser les classes modèles de dja ngo en asyncrone

Pied de page des forums