If two offers have the same exchange rate, how does Ripple decide which one to fulfil first?
If they're in the same order book (same currency/issuer pairs), it's the one that was placed first.
If they're in different order books (say because the source holds balances from more than one issuer) it's a bit more complex. Even if the offer rates are the same, the effective rate might not be the same. For example, if one issuer has a higher transfer fee, that can make the effective rate higher even if the offer rate is the same.
If the effective rate is the same, then it's the one specified first in the transaction's path set. Currently, the server sorts the path set when the transaction is formed based on an attempt to provide the most liquidity and any benefits that can be achieved. So, for example, if one path reduces a balance that's over its limit, that will be preferred.