COI y servicios apátridas. ¿De corta duración o de una sola instancia?

8

Dado un marco de recolección de basura, cuando se usa un contenedor IOC para inyectar servicios puramente sin estado, generalmente es mejor usar la vida útil de una sola instancia del contenedor o recrear el objeto cada vez que se usa y lo tira, y todas sus dependencias, lejos tan pronto como hayas terminado con ellos?

pdr
fuente

Respuestas:

5

Menciona que su servicio tiene dependencias.

Si alguna dependencia en su gráfico de dependencias no está completamente sin estado, o si una de sus dependencias en su gráfico de dependencias debería modificarse para que ya no sea tan completamente sin estado, entonces todo el sistema fallará. Y los errores que obtenga probablemente serán muy crípticos, por lo que será difícil descubrir el problema.

Digamos que eres un equipo de desarrolladores que trabajan en el proyecto. Es muy poco probable que todos y cada uno de ellos sepan que la configuración de IOC requiere que todos estos componentes permanezcan completamente sin estado. Pueden saberlo ahora, pero esa conciencia se desvanecerá con el tiempo. Y si contratas a un chico nuevo, él / ella tampoco se dará cuenta.

Por lo tanto, definitivamente configuraría el contenedor IOC para devolver una nueva instancia cada vez. Es simplemente la opción más segura, en mi humilde opinión.

Ciertamente no me preocuparía por los recursos. El costo de la construcción y la recolección de basura de los objetos es probablemente insignificante en comparación con, por ejemplo, una simple búsqueda en la base de datos.

Pete
fuente
Entonces, ¿estás diciendo crear nuevas instancias cada vez porque es posible que no sepas cómo hacer que un servicio sea apátrida?
Matthew Flynn el
1
No. Lo que estoy tratando de decir es que puede ser difícil predecir cómo se modificará su base de código con el tiempo. Pero la pregunta es extremadamente general, así que estoy dando una respuesta extremadamente general;)
Pete
Sí, la pregunta era deliberadamente general porque no quería arriesgarme a que se produjera mi propio sesgo. Todavía decepcionado por no obtener una respuesta basada en la experiencia, pero esta es la razón mejor pensada, así que gracias.
pdr
4

La instancia única era el comportamiento predeterminado de Spring por una razón: una sola instancia de un servicio sin estado consumirá menos recursos que la creación constante y la recolección de basura de muchas instancias. Además, no existe un peligro real al compartir un servicio sin estado, pero existen algunos problemas de escalabilidad reales al crear varias instancias de un servicio.

Entonces, diría que la instancia única probablemente sea tu amiga.

Matthew Flynn
fuente
0

Sin más contexto, creo que realmente no importa.

Puede obtener los beneficios de los objetos de corta duración de una sola instancia, si esa instancia simplemente crea los objetos de corta duración para cada llamada, y puede obtener los beneficios de una sola instancia de muchos objetos de corta duración, si esos simplemente actúan como contrapesos .

Por supuesto, es innecesariamente ruidoso configurarlo de una manera, solo delegarlo a lo contrario. Así que supongo que debería tener una suposición, si es probable que agregue algún estado, y si es así, si será un estado persistente / global (por ejemplo, al agregar un caché) o un estado local de corta duración.

back2dos
fuente