Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




B

el mar en calma no hace hábiles a los marineros

Fyn4r

#42390

la profesión con más ego de todas

Trabjas con médicos?

2 respuestas
PhDfailer

#42392 Peor aún, científicos.

(Hay de todo, pero menudos egos se gastan algunos)

1 respuesta
TheBrotha

#42392 Trabaja con streamers

3 1 respuesta
Fyn4r

#42393 ah, puf, nono, eso es top 1 indiscutible, doy fe xD

2 1 respuesta
PhDfailer

#42395 Creo que el de arriba tuya me ha superado

1
Wei-Yu

#42380 él no sé qué dirá, pero a mí hay varias cosas que no me gustan. Del método en sí el append y que generes un nuevo buffer no es algo que me entusiasma, pero ese método antes era WriteToBuffer y al convertirlo en append me era más cómod hacerlo así. También creo que podría estar un poco mejor definido, por ejemplo hacer un trait con esas funciones para bytes.Buffer o tener un wrapper sobre bytes.Buffer al que le metes el trait (algo así es probable que acabe haciendo).

Luego, en general, cómo gestiono los buffers es bastante follón y probablemente hay muchas cosas que se pueden decir de cómo inicializarlos, copiarlos y hacerlo más eficiente, pero no era algo de lo que me quería preocupar (como mencioné en el hilo).

Hace tiempo me habría tirado todo este tiempo que he invertido en picar el código en cosas como esas, pero decidí aceptar que no voy a tener código que me gusta a cambio de poder hacer lo que quiero hacer (que en este caso concreto no es trabajar con buffers de forma eficiente ni definir las mejores boundaries entre los datos).

p.d: no quiero PRs en el código, para comentarios está el hilo. El repo estaba privado hasta que abrí el hilo.

p.d2: todo esto al final es bikeshedding

1 respuesta
isvidal

#42378 mira que soy un alineadivs, pero llamar a esta funcion pudiendo ser buffer nill ya es un red flag enorme, el check/instsanciado deberia estar fuera de esta fn.

2 respuestas
Wei-Yu

#42398 el buffer siempre podrá ser nil porque es un puntero, y eso lleva a la conversación de por qué pasarle el puntero y etc etc que son cosas bastante divergentes.

De todas formas ya te anticipo que el null handling de go es bastante malo y las semánticas de error son una cosa bastante bastante horrorosa. En general el lenguaje me está pareciendo muy malo, a ver si llego a la parte de las corrutinas pero anticipo que me voy a quedar igual.

1 respuesta
B

#42394 trabaja con alemanes :stuck_out_tongue_winking_eye:

2
ignasi_

@desu montante un post explicando que estudiarias para dejar de ser un pajeet. te dejo que me insultes aunque no parece que necesites permiso jaja
algo rollo:

  • basicos memoria
  • os
  • compliadores
  • networking etc.

con algun resource y tal. que por muy chulo que seas has pasado mil links de calidad por aquí.

1 1 respuesta
MTX_Anubis

Vengo a decir que estoy de acuerdo con @desu en que Kafka es una de las piezas de software más horripilantes que se han creado en la historia.

#42352 Es peor: Piensa que ya lo sabe todo.

1 respuesta
PaCoX

no habeis ido a la uni o que? sistemas operativos I y II y esas cosas xD
https://www.amazon.com/Computer-Science-Distilled-Computational-Problems/dp/0997316020
https://www.amazon.com/-/es/Robert-Love/dp/0672329468
https://www.amazon.com/-/es/Abraham-Silberschatz/dp/1119800366
https://web.stanford.edu/ouster/cgi-bin/cs140-spring20/index.php
https://www.khanacademy.org/computing/computer-science

4 1 respuesta
desu

#42401

yo no enseño a catalanes, seguro que eres independentista como vidal

#42397Wei-Yu:

no quiero PRs en el código

pues no lo hagas open source

creas un repo y luego te da verguenza de que la gente te comente las cosas que estan mal HAHAHAHA

puedes pre alocar el buffer fpero si sabes el tamaño, xq no lo haces?

buffer = bytes.NewBuffer(make([]byte, 0, PROTOCOL_HEADER+len((msg))))
#42399Wei-Yu:

En general el lenguaje me está pareciendo muy malo

dice despues de escribir un codigo de mierda, el lenguaje no te va a ayudar si no sabes ni lo que es un puntero ni como alocar un buffer

#42402MTX_Anubis:

Es peor: Piensa que ya lo sabe todo.

con saber mas que tu es suficiente

#42398 le deberias pasar el buffer para escribir, porque de esta manera el caller puede gestionar las alocaciones y si ese buffer esta en stack o heap por ejemplo.... super basico

por eso todas las funciones que escriben con buffers en todos los lenguajes de programacion suelen ser asi:

func write(b buffer, content XXX)

de hecho hasta en zig, le puedes pasar el allocator*. para crear estructuras de datos que aloquen como tu quieras y donde tu quieras.

pero el subnormal del vegano, al parecer esta usando un lenguaje de programacion muuuuuuuuuuuuuuuuuuuuuuuuy malo. y por eso no puede ni hacer una simple funcion basica para escribir.

imaginate como sera el resto del codigo si esto ya lo hace mal.

ahora no se lo digas ni hagas una PR, que le veganito apestoso se pone a llorar HAHAHAHAHAHAHAHA

luego por internet a hablar de arquitecturas event driven y mil historias HAHAHAHAHAHA

2 respuestas
ignasi_

#42404 :( no soy indepe
#42403 gracias por los aportes!

nobody1

desu, te leíste este? Como lo leas la turra puede ser inmensa.

1 respuesta
desu

#42406

solo leo cosas del kernel cuando las tengo que correjir. pero suerte con el proceso de mergear algo que pereza. lo bueno es que hay tantos phds trabajando gratis que con crear la issue te lo hacen ellos.

Wei-Yu

Porque no me apetece a secas desu, no estoy interesado en cubrir más que el happy path y cuatro cosas, como también mencioné en el hilo.

#42404desu:

xq no lo haces?

Porque no hace falta; puedes inicializar el struct de Buffer a cero que él mismo hace el resize. Puedo inicializarlo a int max value si me apetece sin tener motivo más allá de "me apetecía hacerlo". Lo he dejado así porque iba haciendo cosas según leía la stdlib de go. Al principio estaba con el primitivo de bytes a pelo y bastante que lo refactoricé para usar el struct de Buffer. Como ya dije antes, no quiero pensar en eficiencia ni en un diseño perfecto porque mi foco no es ese.

El resumen es: no es mi trabajo, no quiero lidiar con edge cases ni pensar en cosas de trabajo.

desu

Vemos un claro ejemplo de mediocridad e incompetencia voluntaria.

Literalmente esta haciendo un proyecto re-escribiendo la capa de networking a mano. Pero eh. ALTO AHI FPERO! DONDE VAS TAN RAPIDO? A ALINEAR DIVS? No nos vamos a preocupar de lidiar con edge cases tan extremos y locos como leer y escribir de buffers, que esto no es nuestro trabajo.

Menuda puta locura tecnica alocar un buffer. Ni Carmack micro doseando LSD en sus buenos años de juventud. Dios mio que alguien le regale un PhD honoris causa a este fpero mundano. Otra pagina html + js que tarda 4 segundos en cargar por aqui por favor!

Mucho mejor dedicar la maxima capacidad de tu unica neurona a diseñar 20 archivos y hacer un poco de arquitectura event driven hexagonal para tener un cliente y un servidor que se comunican por socket.

No vaya a ser que por despiste, aprendamos algo util.

Zoko

Otra pagina html+js que tarda 4 segundos en cargar por aqui por favor!

desu

Desde luego esta que hiciste tu en stream cargaba instant.

1 respuesta
desu

#42410 mi blog es un cohete.

el mejor blog de ingenieria de software del planeta.

en 10 o 15 años la gente rescatara mis post y me vera com el adelantado que era a mi epoca.

el mas influyente de mi generacion.

ps: esta semana he optimizado un servicio un 20%, eso es un par de ks al mes en instancias. tu sigue alineando divs.

1 1 respuesta
Farmijo

#42411 Rulatelo

1 respuesta
desu

#42412 si explicas esto:

#42342Farmijo:

se dedicó a crear un topic por evento

1 respuesta
Farmijo

#42413 Sistema de mensajería AMQP estándar, pero en vez de publicar al exchange/topic asociado a la aplicación/contexto y luego suscribir colas a los eventos que salgan ahí en base a routing key de estos, se está creando un topic por evento.

1 respuesta
desu

#42414 no entiendo el problema. he usado amqp hace muchas años y no tengo en mente los detalles tecnicos.

No entiendo a que te refieres con evento. Event suele ser el mensaje o el schema concreto.

a) esta creando un TOPIC por EVENTO, donde EVENTO = MENSAJE? eso no tiene sentido

Supongo que el problema es este:

b) esta publicando a un topic por tipo de evento, donde seria ENTITY_CREATED, ENTITY_UPDATED y asi?
c) tu quieres publicar a ENTITY, y usar routing_key para CREATED y UPDATED?

Cual es el pro/cons entre usar b y c? entiendo que tu quieres C que usa un header y reduces el numero de topics. Es el numero de topics un problema? Que te proporciona tener routing keys que los topics no o viceversa?

1 respuesta
Farmijo
#42415desu:

Es el numero de topics un problema?

Añade overhead innecesario a los equipos y complejidad accidental en el código. Un punto de salida para todos los eventos/mensajes en el publisher y un punto de entrada para los consumers (y filtrar en cada cola en base al evento) en caso de que uses las routing keys vs N puntos de salida por N tipo de eventos eventos y N puntos de entrada para los consumers (te evitas el filtrado por motivos obvios).

#42415desu:

Que te proporciona tener routing keys que los topics no o viceversa?

Routing keys: Simplicidad en el código de los publicadores (publicas a un topic y te olvidas, no tienes que mantener un mapeo 1:1 tipo de evento-topic). Contras: Se de gente que ha tenido problemas con las máquinas donde corre el rabbit de turno por el filtrado de eventos de las colas. No sería el caso bc AWS.
Topic por evento: A priori, explicitas completamente todos los tipos de evento que estas publicando (ya que si no hay topic, no lo estas publicando). Contras: Generar nueva infra a cada nuevo tipo de evento. Puede llegar a ser un problema en cuanto a integración de colas-topics bc AWS y sus políticas de suscripción.

1 respuesta
hda

#42386 https://www.amazon.es/Fluent-Python-Concise-Effective-Programming-dp-1492056359/dp/1492056359

1
desu

#42416 no veo como tener la solucion mas simple de un evento por topic, donde aplanas todos los eventos a 1on1, donde puedes delegar al broker la mayoria de funcionalidades de garantizar delivery, retries, reliability, balanceado, es añadir overhead.

sin habermelo mirado supongo que la diferencia con rabbit o el broker amqp que sea sera capacitar routing dinamico vs statico en el broker. donde el estatico siempre sera mas eficiente y tendra mas propiedades garantizadas porque el propio broker lo implementa por ti. y voy a suponer que los algoritmos del broker y el codigo es mas eficiente y tiene mejor rendimiento que tu codigo. que como minimo, debera serializar los mensajes en memoria...

deberiamos ver que headers y funcionalidades con metadatos permite el broker para realizar agregados, filtrados, reducers o aplanados (fans in o fans out) para acabar de comparar la complejidad... porque siempre que el broker lo haga por ti sera mas simple, facil y eficiente que si lo programas tu a mano. y esto depende del broker que uses. kafka vs rabbit vs redis...

deberias pensar porque necesitas tener un routing dinamico con las keys, y que significa generar nueva infra. porque meter un topic a un broker no deberia ser ningun problema. y si tienes que migrar o realizar cambios con topics en runtime en ambas situaciones tendiras que realizar una migracion de topics. te da igual si es un topic o un header. la diferencia con un topic es que en casos de estar haciendo pruebas no tienes inconvinientes... pero el dia que llegue a prod ya te dara igual.

luego otro tema seria el de observabilidad y provisionamiento. al menos con kafka y similares escalamos por consumer groups que van asociados a topics. si un evento es mas costoso de procesar, se utilizan los metadatos del broker como el tiempo de consumo de topic o elementos en cola para realizar escalados. si todo esto lo haces con un topic generico no sabes que tipo de eventos tienes ni como son, de nuevo. vas a tener que implementarlo todo tu a mano... lo bueno es que el broker lo haga por ti y tu solo tengas que provisionar o meter reglas de escalado basado en metricas. si publicas 10 eventos a 1 un topic generico, y los 10 eventos se consumen por servicios distintos, que tienen requerimientos de CPU y MEM distintos, como provisionas?

utilizar colas genericas es como usar HTTP donde todo es POST, no utilizas GET ni PUT ni PATCH ni DELETE... todo es un POST donde dentro el body decides la logica y tu consumer se encarga de despatch... veo pocos casos donde esto valga la pena a no ser que usar una routing key sea x100 mas rapido y eficiente vs usar un topic. que lo dudo. ya que como digo la diferencia deberia ser un tema de enrutamiento a nivel interno del broker.

me estas diciendo que usar un HTTP solo con POST, donde solo tienes 1 endpoint de entrada a tu aplicacion. tiene menos complejidad y overhead que usar todas las herramientas que HTTP te proporciona. no lo veo claro... por otro lado, si en lugar de HTTP estas tirando TCP a pelo con tu propio protocolo (broker) y es super eficiente o esta optimizado para tu caso de uso lo podria entender. pero entonces deberias estar trabajando en un broker mas que en aplicarlo como usuario...

añado que yo trabajo con cosas managed y quizas lo que para mi es añadir una linea para crear un topic de kafak, en la practica, requiere mucho mas trabajo. pero bueno, incluso si lo tuviese que hacer a mano no veo que sea un con enorme. a no ser que estuviese haciendo una demo o un mvp... si va a ir a prod me va a dar muchos mas beneficios hacerlo bien desde el principio.

el tema del schema del topic entonces como funciona si usas routing keys? porque el tema de la serializacion y el schema versioning tambien debe ser mas complejo y jodido.

otro ejemplo sobre HTTP, seria router en aplicacion vs network. lo comentaba antes. mucho mas rapido y eficiente router por el path o por headers, que no tener que parsear el body de una request... si utilizas colas te vas a encontrar el mismo problema con los headers vs el body de los eventos. si queires filtrar o enrutar segun propiedades es mejor tener headers. que ahi es donde entiendo que entran las routing_keys. por ejemplo para tener el trafico separado por tenant en entornos multi-tenant.. como los tenants son dinamicos no tiene sentido tenerlo estatico en el topic... y yo supongo que me estas hablando de tener topics para casos de uso que necesitan procesarse. como por ejemplo realizar trabajas en batch periodicos.

1 respuesta
JuAn4k4

#42323 Está bien tirar de monolito, pero no esperéis usar lo mismo cuando queráis tener más equipos y hacer micro servicios. Yo no programaría un monolito pensando en partirlo en un futuro, pensaría si acaso en lo que es el modelo de datos (si necesitas tener retention de años), lo demás irá todo a la basura tarde o temprano.
Meter mierda por si se parte el monolito me parece un desgaste innecesario, YAGNI aquí viene divino. Nunca se va a partir, seguramente se creen nuevos, con tecnología nueva y se vayan sacando funcionalidades de ahí a servicios nuevos que seguramente no serán ni compatibles con el viejo monolito.

GaN2

#42346 el load balancing mediante application layer o network layer tienen cada uno su momento y su lugar, decir que es peor hacerlo mediante application layer para todos los casos no es logico. Hay momentos en los que te interesa hacer LB segun la ruta a la que se acceda en la URL, otras veces te interesara hacerlo en funcion al puerto, IP de origen/destino, etc.

1 respuesta