Exacto, el tema es que debo demorar el ws hasta que vuelva la respuesta. Esto
lo intenté hace un tiempo hacienso un CurrentThread.sleep( n) y lo que me pasó
es que cuando llega el segundo pedido me daba un error en el consumo del ws,
por eso lo plantee desde el punto de vista de escribir en el filesystem ( lo
hice así porque no sabía manejar / porogramar el sistema de colas ).
De todos modos, como dijo jack , vayamos por parte, primero voy a realizar unas
pruebas con IIS, viendo como se comporta lo mas simple de armar y si así no
funca, comenzaremos a complejizar la solución.
Un millon de gracias a todos y los mantengo informado acerca de mi avance.
Saludos
Carlos Peix <[EMAIL PROTECTED]> escribió: Marcelo,
En el escenario que planteas no te queda otra opcion que demorar la ejecucion
del webservice hasta que el resultado este disponible. Si esto puede ser o no
un promblema depende de varios factores. Sugiero que sigas el consejo de
Leonardo y hagas pruebas de carga sobre el servicio real con distinta cantidad
de clientes para que veas cual es el limite.
Carlos Peix
---------------------------------
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Marcelo P
Sent: Jueves, 06 de Diciembre de 2007 10:45 a.m.
To: [email protected]
Subject: [puntonet] Web service asincronico ?
Bueno muchacos, no se como agradecer tanta procupación en el tema!!
Voy a tratar de explicar el negocio a ver si así queda mas claro
Hay negocios que deben validar ciertos datos de los clientes antes de poder
realizar una operación, para eso su sistema en algún momento consume un WS
mio, esto quiere decir que en el mismo momento tengo a n personas conectadas
simultaneamente para pedir digamos "autorización".
El tema es que esto está resuelto en la actualidad yo poniendo un módulo mío
en cada cliente, que llama asincronicamente al ws ( por ende ya se como
consumir asincronicamente un ws desde el cliente), el WS deja al pedido en
el filesystem y vuelve al cliente con un número, y luego vuelve varias veces
a preguntar si está el resultado, hasta que se lo lleva.
El tema que eso lo resuelvo con mi módulo.
Ahora surgió la situación que hay clientes que no quieren módulos de
terceros en sus sistemas por ende, ellos quieren consumir directamente mi
WS, por ende , mandan un mensaje y esperan la respuesta, pero como pueden
ser muchos, no se si no se va a colgar el IIS, abriendo un thread por cada
pedido, ya que va a empezar a encolar y por ende todo puede morir por TO.
Es por eso que pensé que la solucion podía ser asincronismo, pero en el WS
no en el cliente.
La verdad no se como se resuelve esto en otros lados.
Espero que con esto quede mas claro.
Saludos a todos
Oscar Zárate <[EMAIL PROTECTED]> escribió: Marcelo ... estoy un poco
perdido. Voy a citar tus mails anteriores:
1.- Subject del mensaje: Web service asincronico
2.- De este ultimo mail: no se como hacer que el web service se
comporte de forma asincrónica
3.- De un mail anterior: El tema es que la gente que lo va a consumir
no pude seguir con su operación hasta la respuesta de mi WS, asi que por eso
no lo harían asincronico.
Que es lo que queres hacer? No estaras usando en forma erronea la
palabra "asincronico"? Podes explicar un poco mejor el negocio (aunque sea
cambiando los objetos reales por algo que se le parezca asi no tenes que
revelar ningun secreto)?
Yo me perdi.
SaludOZ,
On 12/6/07, Marcelo P <[EMAIL PROTECTED]> wrote: Pero
justamente ese es el problema, no se como hacer que el web service se
comporte de forma asincrónica.
Saludos
"Pablo A. Allois" <[EMAIL PROTECTED]> escribió: Probalo,
personalmente opino que el IIS tiene que responderte bien.
Hacete una aplicacion que tire 400 requests al webservice
funcionando en forma asincrona.
En el performance counter medile:
Al server
- Memoria
- Cpu
- Paging File
Al proceso w3wp.exe
- Memoria
- Cpu
- Threads
Objeto ASP.NET
- Requests current
- Requests queued - asegurate que este
contador se mantenga en cero
Hay mucho mas para moniteorear el server, pero este es un
buen principio.
Y podes tener otros cuellos de botella, como el SQL Server y
proceso que se encarga de parsear el mensaje.
Saludos!
---------------------------------
De: [email protected] [mailto: [EMAIL PROTECTED]
En nombre de Marcelo P
Enviado el: Miércoles, 05 de Diciembre de 2007 12:19 p.m.
Para: [email protected]
Asunto: [puntonet] Web service asincronico ?
Buenas
Repondo sobre esta respuesta , ya que es la que termino de entender
mejor
La idea es mi ws atiende un pedido, ese pedido a su vez llama a un
proceso que se encarga de parsera el mensaje , ponerlo en un cola y
empezar a buscar la respuesta , que puede demorar a lo sumo 3 segundo,
por último insertar un registro en un BD y luego parsear la respuesta
para que sea enviada al que requirio.
Todo esto no tarda mas de 5 a 7 segundos en la actualidad , pero ahora
voy a tener muchos requirimientos en determinados horarios ( no se si
mas de 100 concurrentes pero por ahí ).
El tema es que la gente que lo va a consumir no pude seguir con su
operación hasta la respuesta de mi WS, asi que por eso no lo harían
asincronico.
Al final yo lo que quiero es que no se cuelge el IIS, pero por lo que
dicen el que debería relover el tema de hilos es el IIS y el ws se
comportaría como uno WS simple y sincrónico.
Desde yá, muchas gracias a todos.
Saludos
"Pablo A. Allois" <[EMAIL PROTECTED]> escribió: Hola
Marcelo,
Tenes un estimado de cuanto va a demorar en promedio
la ejecucion de cada request ?
El IIS puede soportar 100 pedidos concurrentes, si no
fuera asi, yo estaria escribiendo en una lista de Apache y www.microsoft.com
estaria sobre tomcat.
Pero te recomendaria que te asesores sobre el tunning
del IIS, puede ser un poco mas complejo que aumentar los hilos en un
.config ... tambien deberias hacerle un monitoreo para asegurarte
que no encole requests.
En cuanto a asincrono o no ... me parece que lo mas
simple es el webservice sincronico y que los clientes lo ejecuten
como mas les guste. Para hacer un webservice que ejecute en forma
asincrona, deberias tener alguna razon que te lo justifique ... y
mejor razon que 100 requests concurrentes.
Saludos!
---------------------------------
De: [email protected] [mailto: [EMAIL PROTECTED] En
nombre de Marcelo P
Enviado el: Martes, 04 de Diciembre de 2007 04:49 p.m.
Para: [email protected]
Asunto: [puntonet] Web service asincronico ?
Bueno,ante todo gracias por las respuestas.
Les comento un poco mas
Las respuestas que debe dar el WS no pueden demorar mas de 5 o 7
segundo.
El tema de querer asincronismo en esto es que, a mi me pueden llegar
100 pedidos concurrentes y no creo que el IIS corriendo asp.net
pueda trabajar con tantos hilos a la vez asi como si nada, por eso
es que yo quiro un asincronismo, ya que pienso que eso es la
solución, per la verdad no lo se.
Como les dije antes, la duda mia con el asincronismo, es que si yo
llamo a un proceso A de un web service, que ejecute algoi
asincronicamente, cuanlo lo llame, me va a devolver el control al
flujo del WS, por ende va a terminar y se va a ir de nuevo al cliente,
sin que todavía este la respuesta, por ende nunca se que hay una
respuesta.
Espero haber sido claro, sino avisen y lo trato de expolicar mejor.
Saludos a todos
Carlos Peix < [EMAIL PROTECTED]> escribió:
Hola Diego,
La diferencia entre un WS que quede procesando y el
cliente maneje el pedido asincronico y lo que propone Oscar es
"Escalabilidad". IIS y ASP.NET estan preparados para
atender muchas peticiones pero con la condicion de que sean de
ejecucion breve, muy breve. ASP.NET muere tempranamente si te
demoras en responder la solicitud, incluso es sorprendente que con
unos pocos clientes puedas tirarlo por el piso. Esto no es un
error de diseño en ASP.NET, mas bien es porque los diseñadores
asumen algunos puntos de partida, uno de ellos es que el request
debe ser resuelto lo mas rapido posible.
El tema que plantea Marcelo tiene dos salidas, si el
tiene requests que impliquen no tiene mas de 10 o 15 requests
concurrentes (por ejemplo, si el request tarda 1 segundo y tiene
100 clientes que se comunican cada 10 segundos, tiene un promedio
de 10 clientes concurrentes), entonces puede intentar ver si
funciona con la solucion simple (sincronico o blocking del lado
del server y asincronico del lado del cliente). Si, en cambio,
necesita mas capacidad, probablemente necesite algo como lo que
propone Oscar.
La solucion que vos mencionas se acerca a la que
propuso nuestro amigo rapado (Oscar) pero adolece de algunos
riesgos para mi gusto: no me gusta mucho hostear worker threads en
el proceso de ASP.NET, la escalabilidad es limitada tambien (no
por el limite de threads de ASP.NET sino por la capacidad de
proceso del server). Siembre es bueno que un web server tenga
mucho procesador disponible.
La solucion basada en MQ para el request y uno o mas
procesadores en paralelo es buena. Queda resolver la vuelta de la
respuesta. Algunos utilizar MQ tambien para la vuelta pero a mi no
me gusta, prefiero volver por una base de datos SQLServer para
tomar el mensaje por ID en lugar de escanear toda la cola de
vuelta para buscar el mensaje (hasta donde se, MQ no tiene una
operacion eficiente para tomar un mensaje por ID). Igual, esto
seria importante solo en casos de muy alto caudal.
Abrazo
Carlos Peix
---------------------------------
From: [email protected] [mailto: [EMAIL
PROTECTED] On Behalf Of Diego Jancic
Sent: Lunes, 03 de Diciembre de 2007 08:16 p.m.
To: [email protected]
Subject: [puntonet] Web service asincronico ?
Hola Oscar,
Pero entre enseñarle al programador a manejar ese
WS con todos esos métodos y enseñarle a hacer la llamada
asincrónica (si es que no la sabe), no es mas fácil la 2da?
Yo justo ahora estoy haciendo algo como lo que
decis, envio pedidos (via MSMQ) y hay N threads (prefijados por
configuración) que procesan todas las tareas
pero eso es por
motivos muy particulares y (si esta todo dentro de IIS) la carga
no cambia en nada
Si usas un WS, o una pagina web IIS ya te da
la funcionalidad de tener multiples threads, una cola de
mensajes en espera, etc
No es que quiera parecer muy negativo, pero me no
lo veo eh.. J
Salu2!
From: [email protected] [mailto: [EMAIL
PROTECTED] On Behalf Of Oscar Zárate
Sent: Lunes, 03 de Diciembre de 2007 07:28 p.m .
To: [email protected]
Subject: [puntonet] Web service asincronico ?
Agrego algo mas.
El metodo IniciarTarea podría estar escribiendo
los parametros de la consulta en una Queue y del otro lado de la
Queue podría haber N servidores leyendo la Queue y tomando el
requerimiento de la consulta (haciendo la consulta y escribiendo
en la table de resultados).
Me gusta la idea ... me parece que me fui de
mambo, pero me gusta.
SaludOZ,
PS: No creo ser muy original con esto, ya debe
estar implementado mil veces y seguro seguro seguro ... hay un
patron con nombre para resolver esto.
On 12/4/07, Oscar Zárate <[EMAIL PROTECTED]>
wrote:
Yo creo que la idea sería escribir algo que
responda "inmediatamente" o responda ... "preguntame luego con
este ticket.
No se cual es el negocio, pero me imagino algo
que tenga mucho tiempo de procesamiento ... entonces el web
service tiene un metodo iniciar tarea (no el proxy, el web
service) este metodo inmediatamente retorna un ticket y dispara
un proceso y cuando finaliza el proceso guarda el resultado
completo en una tabla con ID igual al numero de ticket. Luego,
otro metodo que recibe el ticket y devuelve "resultado" o
"preguntame luego". Este segundo metodo, busca en la tabla si
existe algun resultado para ese ticket, si existe retorna el
resultado, sino retorna "preguntame luego".
Incluso la respuesta del proceso deberia ser
formateada para que el metodo que devuelve sea lo mas rapido
posible (solo lee y retorna, no pierde tiempo en ningun
formateo).
De este modo, haces un "servicio" (sea web o no)
que es "asincronico". Incluso en el caso de una consulta MUY
RAPIDA, la consulta completa consta igual de una llamada a dos
metodos.
Espero haber sido claro, creo que de ese modo
solucionas el problema.
SaludOZ,
On 12/4/07, Diego Jancic <[EMAIL
PROTECTED]> wrote:
Hola,
Lo que no vas a poder hacer es que sea asincrónico desde el
punto de vista
del cliente. El cliente (desarrollado por cualquier otra
persona) se
conecta, recibe una respuesta y ya esta, no podes hacer nada
mas.
Lo que podrías hacer es trabajar dentro del web service para que
no funcione
dentro de un thread de IIS, y asi sobrecargas menos al IIS.
Cuando decis "o que se comporte de alguna manera de atender
muchas
peticiones", no se bien a que te referis. Los WS están
preparados para
recibir muchas peticiones, y si al usuario final le molesta que
tarde tanto
(imaginemos que realiza un proceso largo, pero no se está sobre
cargando el
servidor del WS), es trabajo del que arma el cliente hacer que
le aparezca
un hermoso "loading..."
Posiblemente la solución sea escribir un help para enseñarle a
los otros
desarrolladores a hacer las cosas asincrónicas :)
Saludos!
-----Original Message-----
From: [email protected] [mailto: [EMAIL PROTECTED] On Behalf
Of Leonardo
Micheloni
Sent: Lunes, 03 de Diciembre de 2007 05:55 p.m.
To: [email protected]
Subject: [puntonet] Web service asincronico ?
Entonces no te puedo ayudar, no tengo idea
On Dec 3, 2007 3:15 PM, Marcelo P < [EMAIL PROTECTED]> wrote:
> Gracias por la respuesta
> El tema es que yo tengo que desarrollar un web service para
> que sea
> consumido por cualquiera, yo no programo ni armo el proxy. Lo
> que tengo
que
> hacer es que el web service sea asyncronico o que se comporte
> de alguna
> manera de atender muchas peticiones.
> Saludos
>
__________ Información de NOD32, revisión 2699 (20071203)
__________
Este mensaje ha sido analizado con NOD32 antivirus system
http://www.nod32.com
---------------------------------
Compartí video en la ventana de tus mensajes y también tus fotos de
Flickr.
Usá el Nuevo Yahoo! Messenger versión Beta.
Visitá http://ar.beta.messenger.yahoo.com/
---------------------------------
Tarjeta de crédito Yahoo! de Banco Supervielle. Solicitá tu nueva
Tarjeta de crédito. De tu PC directo a tu casa.
Visitá www.tuprimeratarjeta.com.ar
---------------------------------
Tarjeta de crédito Yahoo! de Banco Supervielle. Solicitá tu nueva
Tarjeta de crédito. De tu PC directo a tu casa.
Visitá www.tuprimeratarjeta.com.ar
---------------------------------
Tarjeta de crédito Yahoo! de Banco Supervielle. Solicitá tu nueva Tarjeta de
crédito. De tu PC directo a tu casa.
Visitá www.tuprimeratarjeta.com.ar
---------------------------------
Los referentes más importantes en compra/venta de autos se juntaron:
Demotores y Yahoo!.Ahora comprar o vender tu auto es más fácil.
Visitá http://ar.autos.yahoo.com/