\begin{figure}[H] \centering \resizebox{\textwidth}{!}{% \begin{tikzpicture}[ font=\footnotesize, node distance=0.45cm and 0.55cm, box/.style={draw=ipsblue, rounded corners=3pt, align=center, inner sep=4pt, minimum height=0.95cm, minimum width=2.55cm, fill=codebg, text=black}, title/.style={font=\small\bfseries, text=ipsblue, anchor=west}, arr/.style={-{Latex}, thick, draw=ipsblue} ] % --- 1: API Gateway --- \node[title] (t1) at (0,0) {API Gateway}; \node[box, below=0.3cm of t1.west, anchor=west] (client) {Desktop / Agent}; \node[box, right=of client] (gw) {Gateway :8189}; \node[box, right=of gw] (svc) {Microservicios}; \draw[arr] (client) -- (gw); \draw[arr] (gw) -- (svc); % --- 2: ARQ --- \node[title] (t2) at (0,-2.15) {Cola async (ARQ)}; \node[box, below=0.3cm of t2.west, anchor=west] (api) {extraction API}; \node[box, right=of api] (redis) {Redis / ARQ}; \node[box, right=of redis] (w) {Workers $\times N$}; \draw[arr] (api) -- (redis); \draw[arr] (redis) -- (w); % --- 3: Claim --- \node[title] (t3) at (0,-4.3) {Claim / lease (orquestaci\'on)}; \node[box, below=0.3cm of t3.west, anchor=west] (store) {bot-descarga\\(orquestador)}; \node[box, right=of store] (claim) {claim at\'omico}; \node[box, right=of claim] (agent) {Agent Selenium\\(PC)}; \draw[arr] (store) -- (claim); \draw[arr] (claim) -- (agent); \end{tikzpicture}% } \caption{Patrones: Gateway, cola ARQ y claim. El servicio \texttt{bot-descarga} \textbf{orquesta}; el \textbf{agent Selenium} en el PC ejecuta la descarga.} \label{fig:patrones} \end{figure}