He estado trabajando con akka durante 7-8 meses a diario. Cuando comencé, estaba trabajando en aplicaciones y noté que los actores se usarían básicamente en cualquier lugar una vez dentro del sistema de actores para comunicarse entre la mayoría de los objetos. Así que hice lo mismo: girar a otro actor para x / y / z.
Me parece que esto puede ser demasiado indiscriminado, agregando complejidad donde no se necesita, pero no puedo encontrar ninguna discusión sobre dónde deberían usarse los actores frente a la lógica síncrona simple o incluso asíncrona a través de futuros. Comencé a reflexionar sobre mi postura después de que mi compañero de trabajo mencionó algo similar. Me di cuenta de varios casos más recientes en los que he reflexionado sobre una tarea y luego evité crear otro actor porque podría lograr el mismo resultado de forma segura en una implementación inmutable, por ejemplo, algo como obtener valores de configuración de un archivo o archivo en algún lugar al que accedes con poca frecuencia y lo harás Espere a que el resultado sea el caso de uso real.
En particular, me parece que en cualquier caso en el que juegas con un estado inmutable, los actores crean complejidad y limitan el rendimiento: una función pura en un objeto, por ejemplo, se puede llamar simultáneamente sin ningún riesgo con ningún nivel de concurrencia, aún un actor solo puede procesar un mensaje a la vez. La consideración alternativa es que estacionará el hilo si necesita esperar el resultado a menos que comience a usar futuros, pero en los casos en que no necesita preocuparse por la mensajería asíncrona o la escala, parece que puede ser excesivo contratar a un actor.
Entonces mi pregunta es: ¿hay un mal momento para usar actores? Tengo curiosidad por cómo se ve Erlang y realmente me gustaría la visión de otras personas. O si hay algunos principios en torno al uso del actor.
fuente
ask
un actor y solo usar un planoFuture
.Respuestas:
Esta es una pregunta que me interesa y en la que he estado investigando. Para otros puntos de vista, vea esta publicación de blog de Noel Walsh o esta pregunta sobre Stack Overflow. Tengo algunas opiniones que me gustaría ofrecer:
Al igual que Jason, estoy ansioso por escuchar la opinión de otras personas aquí. ¿Cómo puedo abordar algunos de los problemas anteriores y usar Akka mejor?
fuente
Vale la pena considerar para qué se utiliza el modelo de actor: el modelo de actor es
Esto es valioso porque el uso del estado compartido de múltiples subprocesos se vuelve realmente difícil, especialmente cuando hay relaciones entre diferentes componentes del estado compartido que deben mantenerse sincronizados. Sin embargo, si tiene componentes de dominio en los que:
entonces el modelo de actor no proporcionará mucho beneficio (si lo hay).
Espero que ayude.
fuente
Tu intuición es correcta, en mi humilde opinión. Usar actores en todas partes es como tener el martillo proverbial y ver solo clavos.
La mejor práctica de Erlang es utilizar procesos / actores para todas las actividades que suceden simultáneamente. Es decir, como en la vida real. A veces es difícil encontrar la granularidad correcta, pero la mayoría de las veces solo se sabe mirando el dominio modelado y utilizando un poco de sentido común. Me temo que no tengo un método mejor que ese, pero espero que ayude.
fuente
En orden de entrada / salida de mensajes:
Recientemente me encontré con una aplicación basada en akka donde el modelo de actor realmente causó problemas de concurrencia, un modelo más simple hubiera sido mejor bajo carga.
El problema era que los mensajes entrantes se movían en diferentes 'carriles' (a través de diferentes rutas de actores) pero el código asumía que los mensajes llegarían a su destino final en el mismo orden en que llegaron. Mientras los datos llegaran con intervalos suficientemente largos, esto funcionaría porque solo habría un mensaje conflictivo en carrera hacia el destino. Cuando los intervalos disminuyeron, comenzaron a llegar fuera de servicio y causaron un comportamiento extraño.
El problema podría haberse resuelto correctamente con un poco menos de actores, pero es un error fácil de hacer al usarlos en exceso.
fuente
En mi opinión, hay dos casos de uso para los actores. Recursos compartidos como puertos y similares, y gran estado. El primero ha sido bien cubierto por la discusión hasta ahora, pero el estado grande también es una razón válida.
Una estructura grande que se pasa con cada llamada a procedimiento puede usar mucha pila. Este estado se puede colocar en un proceso separado, la estructura se reemplaza por una identificación de proceso y ese proceso se consulta según sea necesario.
Las bases de datos como mnesia pueden considerarse como un estado de almacenamiento externo al proceso de consulta.
fuente