Hi Nicolas,
The difference is that in classical FBP the downstream component is not "triggered" into action. That is how event driven implementations like NoFlo work.
Components share IPs over a bounded buffer. That is a FIFO queue that sits between the two components.
As far as I'm aware event driven FBP does not have back pressure.
The downstream component receives an IP from an upstream component by reading from it's queue. Every time it does this a space is made available in the queue so that any component blocked by back pressure will then be able to proceed.
A deadlock occurs then the flow graph contains a loop. This means that one component is both upstream and downstream from another. If that component is blocked by back pressure then it will never clear because it is blocking itself. Rather like grid lock.
Unlike city streets FBP's connecting buffers are not limited by physical space and this allows us to fix the deadlock problem by introducing self expanding buffers. When a loop exists one of the connections can be made into a buffer that will grow so that back pressure never occurs. This means that a deadlock will not happen.
This comes at a cost because you lose the important feedback mechanism provided by back pressure. With back pressure you quickly find out that there is a problem because your graph locks up. Without grid lock you discover the issue months after deployment when peak load causes your server to run out of memory.
Loops can't always be avoided, so the self expanding buffer is there when you need it.
Regards,
Ged