Ahora he escrito algunas aplicaciones con actores scala y estoy interesado en cómo la gente se ha acercado o ha tratado algunos de los problemas que he encontrado.Escribo aplicaciones con actores de Scala en la práctica
¡Una plétora de clases de mensajes o!?
Tengo un actor que reacciona a una operación de usuario y debe causar que algo suceda. Digamos que react
s a un mensaje UserRequestsX(id)
. Un problema continuo que tengo es que, como quiero modularizar mis programas, un solo actor por sí solo no puede completar la acción sin involucrar a otros actores. Por ejemplo, supongamos que necesito usar el parámetro id
para recuperar un grupo de valores y luego estos deben ser eliminados a través de otro actor. Si estuviera escribiendo un programa Java normal, podría hacer algo como:
public void reportTrades(Date date) {
Set<Trade> trades = persistence.lookup(date);
reportService.report(trades);
}
Que es lo suficientemente simple. Sin embargo, usar actores esto se vuelve un poco molesto porque quiero evitar el uso de !?
. Un actor reacciona al mensaje ReportTrades(date)
, pero debe solicitar un PersistenceActor
para las transacciones y luego un ReportActor
para informarlas. La única forma que he encontrado para hacer esto es hacer:
react {
case ReportTrades(date) =>
persistenceActor ! GetTradesAndReport(date)
}
Así que en mi PersistenceActor
tengo un bloque de reaccionar:
react {
case GetTradesAndReport(date) =>
val ts = trades.get(date) //from persietent store
reportActor ! ReportTrades(ts)
}
Pero ahora tengo 2 problemas:
- Tengo que crear clases de mensajes adicionales para representar la misma solicitud (es decir, "transacciones de informe"). De hecho, tengo tres en este escenario, pero puedo tener muchos más: se convierte en un problema mantener el seguimiento de estos
- ¿Cómo debo llamar al primer y tercer mensaje
ReportTrades
? Es confuso llamarlos a ambosReportTrades
(o si lo hago, debo ponerlos en paquetes separados). Esencialmente no hay tal cosa comooverloading
una clase por tipoval
.
¿Hay algo que me falta? ¿Puedo evitar esto? ¿Debería renunciar y usar !?
¿La gente usa alguna estructura organizacional para aclarar lo que está pasando?
¿Es seguro acceder directamente a la tienda persistente en "reaccionar"? Pensé que no podrías hacer operaciones de bloqueo.Tal vez "recibir" es necesario para ese actor en particular. –