Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




desu
#51150eXtreM3:

desconozco cómo funcionan otros brokers de manejo de colas como los que mencionas

Yo si lo conozco, por eso te estoy enseñando y te digo que estas equivocado.

Al no tener delivery guarantees no puedes modelar las cosas de la misma manera ni tener la misma API en la interficie... vas a tener que tocar toda la implementacion tanto en consumer como en producer y en consecuencia te daba igual tener o no una API agnostica generica.

Conclusion, habras perdido cientos de horas en cosas que no vale la pena dedicar tiempo porque como tu bien dices.

#51150eXtreM3:

desconozco cómo funcionan otros brokers de manejo de colas como los que mencionas

No puedes resolver lo que no entiendes. Como puedes plantear una solucion a un problema que no entiendes? Si supieses como funcionan y porque funcionan como lo hacen, no perderias el tiempo haciendo "arquitectura de software".

Y lo mismo se aplica en muchas cosas que desconoces porque eres un ignorante. La proxima vez deberias recibir las clases con mas humildad y gratitud.

El hecho de que tengas un ego tan grante dandonos clase cuando eres un ignorante que desconoce de lo que habla, es lo que te hace seguir siendo un fpero.

Un buen ingeniero no tiene ego. Una buena persona no tiene ego.

Te recomiendo:

1 - ser mas amable
2 - ser mas abierto de mente
3 - ser mas agradecido
4 - ser mas educado
5 - ser mas respetuoso

Si aplicas estos 5 pasos cada dia, durante un par de años, quizas, algun dia, entiendas algo de arquitectura de software.

Kaledros

Desu tiene razón.

Puedes tener una abstracción agnóstica de la cola de consumer y producer que definan "produce", "consume" y las dos o tres funcionalidades básicas, y luego en la implementación ya te acoplas a Rabbit, Kafka, solución in-house que sea, etc. Lo que pasa es que si luego cambias de Rabbit a Kafka no es tan sencillo como cambiar la implementación porque los consumers no funcionan igual, los producers no funcionan igual, los topics no se comportan igual que las colas y Kafka no tiene exchanges mientras que Rabbit sí, por ejemplo.

Eso hace que tengas que tirar a la basura no sólo la implementación, sino cualquier cosa por debajo del servicio de publicación y consumo, que es bastante más costoso. Si el resto de la aplicación está hecha para "pensar" en topics y no en exchanges, la cagada es aún más gorda.

2 respuestas
desu

#51152 Exacto por eso invente la idea de que el buen codigo no se re-utiliza si no que es facil de re-emplazar.

Si tu codigo es facil de re-emplazar (tirar a la puta basura fpera que se merece donde viven los mononeuronas del hilo) signfica que tu codigo es:

  • facil de testear al maximo
  • facil de modificar al maximo
  • rapido y eficiente al maximo
  • facil de entender porque solo hace 1 cosa y la hace muy bien, localidad maxima
  • facil de entender como se usa, globalidad maximo

En cambio cuando quieres hacer cosas re-utilizables e intercambiarlas pierdes cualidades y caracteristicas como la rapidez y eficiencia, la facilidad de entender, la facilidad de usar porque debe mantenerse interoprable y agnostico... etc etc.

Por eso yo doy clase, el fpero llora.

eXtreM3

#51152 pero qué tiene que ver la implementación o no de un sistema de colas con todas las capas que no sean infraestructura?

Puedes tener tu aplicación funcionando perfectamente síncronamente y si el día de mañana, por lo que sea, quieres implementar colas, no debería afectar absolutamente a nada de tus capas intermedias, mucho menos a las reglas de negocio ni a los casos de uso que ya tengas.

No culpes al juego, culpa al jugador.

1 respuesta
Kaledros
#51154eXtreM3:

Puedes tener tu aplicación funcionando perfectamente síncronamente y si el día de mañana, por lo que sea, quieres implementar colas, no debería afectar absolutamente a nada de tus capas intermedias, mucho menos a las reglas de negocio ni a los casos de uso que ya tengas.

Si tu aplicación cambia de sync a async y no tienes que cambiar absolutamente nada más que la infra, escribe un libro y publícalo porque te haces de oro.

1 1 respuesta
desu

Voy a dar un ejemplo tonto, at-least-once publishing guarantees en PUB/SUB.

Esto signfica que en tu cola puedes tener eventos duplicados...

Me gustaria ver como se mantiene la arquitectura de software hexagonal oop funcional en reactive programming al cuadrado del fpero de @extrem3

introducir HAHAs x4

En fin, esto es lo que pasa cuando hablas con gente que no ha trabajado (bien) en su puta vida. Y esta gente, suelen ser los profesores de universidad que explican estas chorradas.

1 respuesta
eXtreM3

#51155 a ver, a ver. Hablamos de que ya tengas al menos tu aplicación orientada a eventos.

Cuando quieras pasarla a asíncrona (con Rabbit, que es lo que conozco y tengo en producción en varios proyectos), lo único que tienes que hacer es la implementación de Rabbit configurando el exchange correspondiente y las clases consumer y publisher.

También puedes controlar el tema de eventos duplicados.


Estoy bastante seguro de que si cambiase rabbit por sqs o cualquier otro gestor, lo único que habría que cambiar sería esta implementación y quizás, las clases de los eventos para cambiarles el nombre y la clase de la que extienden (por ejemplo DomainEvent que se encuentra en un único sitio Shared) para garantizar el mismo formato del payload. Y FIN.

#51156 haha x'D

2 respuestas
pantocreitor

El otro día estábamos hablando sobre el tema de sync/async por un tema que estamos montando y obviamente si tienes algo sync entre medio bloqueas toda la asincronia y se va a la puta todo (al final tienes hilos ocupados por la puta sincronía)

2 respuestas
Konishi

introducir HAHAs x4

No sabía que el precio de los tokens se había disparado tanto.

Bromas a parte, ¿Alguna recomendación de bibliografía sobre el tema tratado? Como FPero que soy admito que habría tirado por el punto que defiende eXtreM3, me gustaría saber cómo se suele afrontar ese tipo de decisiones desde empresas más... profesionales.

1 respuesta
desu
#51157eXtreM3:

Estoy bastante seguro

Ya te han dicho varias personas que estas equivocado, ya somos 3 vs 1. Y te aseguro sin riesgo a equivocarme que estas 100% equivocado, y nunca en la vida estaras en lo cierto porque el software no va a cambiar.

#51158 pues hazlo todo async... hoy en dia absolutamente todo el codigo debe ser async en user space. te diria que el 100% del codigo esta capacitado para serlo que alguien me corrija. alguna excepcion y truquitos raros hay a nivel de kernel pero dudo que programes kernels a mano.

que tienes que hacer?

#51159 pues normalmente estas decisiones se toman mal. tu deber deberia ser minimizar el destrozo que los fperos van a hacer. por ejemplo en mi equipo tras años aqui por fin han aprendido a base de decirselo y decirselo que las colas no deben usar topics genericos... sino aplanar los topics / exchanges al maximo y hacer las cosas estatica. pero siguen hacindo java con spring por ejemplo... me pego un tiro en la cabeza.

en un equipo ideal, estas cosas no pasan y por tanto no hay problemas.

2 respuestas
Kaledros
#51157eXtreM3:

Estoy bastante seguro de que si cambiase rabbit por sqs o cualquier otro gestor, lo único que habría que cambiar sería esta implementación

Y yo te aseguro que no porque lo he hecho, o al menos lo he intentado, y no sólo tuvimos que rehacer toda la capa de comunicación, sino que tuvimos que tirar media aplicación a la basura porque no es lo mismo trabajar con mensajes que con eventos. Cosas tan sencillas como que si enchufas dos consumers a la misma cola en Rabbit el mensaje sólo lo procesa uno de ellos y el otro no lo recibe nunca, mientras que en Kafka lo pueden consumir todos los consumers del grupo, te joden la vida si montas tu app pensando en eventos y luego tienes que pasar a mensajes.

1 respuesta
eXtreM3

#51160 cómo me puedes decir que estoy equivocado si te he descrito casi al detalle lo que he hecho hace menos de un mes en un proyecto síncrono donde se han pasado todos los eventos a rabbit? Que no he tenido que tocar las capas internas, pesado.

Casos de uso modificados por implementar rabbit: 0
Lógica de dominio modificada por implementar rabbit: 0

Que seas un animal diseñando no significa que la arquitectura de software no funcione. Sigue metiéndote con los fperos y no diseñes nunca software, por el bien de la empresa en la que estés.

#51161 y esos cambios en los consumers no son responsabilidad de la implementación de Kafka?

1 respuesta
Soltrac

El día q se ponga de moda la arquitectura heptagonal y tengáis que reescribir todo lo q habéis escrito q funciona perfectamente porque el jefe de turno piense que la arquitectura heptagonal mola entonces me habláis de capas y gilipolleces.

6
Lifecasi0

Con TDD esto no pasa.

1
Seyriuu

#51158 Desde la ignorancia (dado que en el sector que yo me muevo la asincronía apenas existe), ¿Es posible que algo sea 100 % asíncrono?

¿No debe haber al menos un thread siguiendo una ejecución principal?

Por ejemplo, una web, aunque tu primer llamada sea una función asíncrona que ya te monta toda la web y dispare más funciones asíncronas que hagan lo que tengan que hacer, ese primer punto en el que llamas a esa función es síncrono y ahí se va a quedar, ¿no?

1 respuesta
GaN2

#51117 Que clase de retraso mental debe de tener el recruiter para escribirte semejante email y pretender que le respondas. Gente que escribe cual niño salido del Fornite a base de emoticonos deberia de descontarle a la empresa en concepto de disminucion psiquica...

#51130

3
Kaledros

#51162 Te pongo un ejemplo.

Tengo una app de ecomerce. Quiero que cuando se añada un item al carrito (evento 1) se actualice el stock del item (acción A), el carrito (acción B), y le envíe un correo al supplier si el stock queda por debajo de una cantidad mínima (evento C). Es decir, necesito 3 listeners. Listeners, no consumers.

Puedo hacer que mi app implemente un servicio addItemToCart (capa de servicio) que al añadir un item llame a UN (mayúsculas para reiterar) producer (capa de infra), el producer envíe UN evento a UNA cola y TRES consumidores lo procesen y llamen a los servicios (capa de servicio) correspondientes. Eso en Kafka. Ahora imagina que cambias a Rabbit.

En Rabbit, mi servicio tiene que llamar a UN producer (capa de infra) que envíe UN mensaje a un exchange, que lo convertirá en TRES mensajes, los enrutará por topic (o por fanout) a TRES colas para ser consumidos por TRES consumers. Porque no puedes hacer que un único evento sea leído por múltiples consumers, para N consumers tienes que enviar N mensajes por N colas.

De momento, ya tienes el triple de colas en Rabbit que en Kafka, y sólo va a ir a peor. Si quieres añadir más acciones (D, E, F, etc) en la versión Kafka sólo tienes que crear el nuevo consumer y que consuma del mismo topic, mientras que en Rabbit, para cada evento nuevo, necesitas un consumer, una cola y un topic. Si quieres que el mismo evento lo consuma más de un consumer tienes que empezar con mierdas como consume.add.to.cart.and.do.x, consume.add.to.cart.and.do.y, etc.

En cuanto la aplicación te crezca un poco, te lo prometo porque me costó el empleo, es INMANEJABLE la cantidad de colas y topics que tienes que gestionar para hacer lo mismo que hace Kafka con incluso sólo un topic, lo que significa que tu app está mal diseñada y te toca tirarla a la puta basura.

Sólo porque has cambiado el sistema de comunicación.

2 respuestas
Farmijo

Desu tiene razón en el tema de que si no conoces muy bien las posibles implementaciones no deberías abstraerlas (de ahí el follón que el otro ha tenido con rabbit vs Kafka, porque son dos conceptos diferentes y no deberían convivir bajo la misma abstracción).

De ahí a decir que las abstracciones son malas y blabla…. como todo en este curro, depende. Si eres un fphpero con su simfony/doctrine, meter abstracciones es absurdo, nadie va a cambiarte el ORM. Si eres un fpero de node que un día le meten prisma y otro día le descontinúan el orm… ahí vale la pena.

Farmijo

#51167 que la gestión de colas de rabbit sea más follonera que los topics de Kafka no hace que una abstracción no funcione, hace que la gestión de Infra sea un infierno, son cosas diferentes.
El concepto de producer lo puedes mantener abstraído para un servicio a “me llega el mensaje y lo meto aquí y ya se publicará”
El concepto de consumer lo puedes mantener a “me conecto a X sitio y me llegan mensajes que convierto a DTOs que entienda”.

1 respuesta
Kaledros
#51169Farmijo:

que la gestión de colas de rabbit sea más follonera que los topics de Kafka no hace que una abstracción no funcione, hace que la gestión de Infra sea un infierno

Lo que hace es que tu approach no funcione, que es peor. Diseñar una app de servicios que se comunican asíncronamente y cagarla al elegir el sistema de comunicación convierte tu app en una mierda pinchada en un palo y te obliga a tirarla a la basura, por mucho que la abstracción no haya sido el problema.

pantocreitor
#51160desu:

#51158 pues hazlo todo async... hoy en dia absolutamente todo el codigo debe ser async en user space. te diria que el 100% del codigo esta capacitado para serlo que alguien me corrija. alguna excepcion y truquitos raros hay a nivel de kernel pero dudo que programes kernels a mano.

que tienes que hacer?

Resumiendo un poco estamos modernizando una app antigua que no escala bien y necesitamos que escale. La idea es hacerla async como todo lo nuevo que estamos haciendo con Java 21 y Rust.
Nos hemos encontrado problemas a nivel de librerías antiguas que tendríamos que modificar para que funcionasen de manera asíncrona (librerías que no son nuestras, las nuestras la mayoría hay versiones nuevas que se usan en servicios asíncronos).
Hay un poco de debate de si dejarlo como está y rehacer la app de manera modular y bien hecha para lo qu enecesitamos o modificar la antigua.

#51165 A nivel interno siempre vas a tener hilos chequeando el estado de otros hilos, el tema está (muy por encima) en que las operaciones asíncronas no bloquean los hilos cuando están WAITING y si necesitan esperar sueltan el hilo y ya seguirán cuando se termine lo que están esperando, así los hilos siempre están trabajando y no hay hilos parados.
A nivel de una web realmente lo veo sencillo, haces la petición al server y te mandan la info, esta info te la mandan según el servidor la vaya pillando de la cache, si en algún momento el hilo qu ese está en cargando de eso tiene que hacer una petición a base de dato para algo, ese hilo se ocupa en otra tarea hasta que el proceso obtenga la info para enviártela.
El punto de entrada que comentas es simplemebte un punto de entrada, la asincronía empieza ahí (o yo no te estoy entendiendo bien xD)

Todo esto muy por encima y sin darle muchas vueltas.

1 2 respuestas
desu

#51171 Si la libreria es sync, podrias reducir todo excepto esas librerias usando las nuevas corutinas nativas o reactor.

1 respuesta
y34hl0ve

#51167 Tío me fascina leeros y no me entero de una valiente mierda xD
¿Todo este tipo de cosas las vais aprendiendo con el paso de los años en el trabajo o cuando utilizáis alguna herramienta profundizáis al máximo en ella y por eso aprendéis tanto? Que yo como buen FPero siento que no estoy ni cerca de saber cosas así.

1 3 respuestas
desu

imaginate el nivel para que hasta el spiderman (top 5 tontos del hilo) te humille jajaj

1 respuesta
Tuskus

#51173 Beh, yo me entero de la mitad de lo que hablan, a mí con cobrar al final de mes y vivir bien me vale xD

Kaledros

#51173 Es experiencia, no te preocupes. Vas entrando a sitios, aprendiendo cosas, etc.

1
Wei-Yu

#51174 haz tier top y bottom del hilo va

yo ya se que soy un power bottom porque genero energía desde abajo

2 1 respuesta
Kaledros

Eh, que yo no he venido a humillar a nadie, pero esto en concreto lo aprendí por las muy malas y hasta a mí se me quedan estas cosas.

PiradoIV

#51173 Toda nuestro conocimiento viene del blog de @desu y de su stream top. Poco a poco alineas punteros al toque.

2
pantocreitor

#51172 en principio reactor ya que hemos probado a nivel de rendimiento funciona mejor que Java 21 con streams y virtual threads