Hi,
Yes, they are class exception, Maybe the following name will be better
class BusinessCompensationFailureException
class OmegaConnectedException
My idea is to catch an exception and send a compensation result in the
compensation method[1] on the Omega side. You can see it in the following
TODO position
public void apply(String globalTxId, String localTxId, String
callbackMethod, Object... payloads) {
CallbackContextInternal contextInternal = contexts.get(callbackMethod);
String oldGlobalTxId = omegaContext.globalTxId();
String oldLocalTxId = omegaContext.localTxId();
try {
omegaContext.setGlobalTxId(globalTxId);
omegaContext.setLocalTxId(localTxId);
contextInternal.callbackMethod.invoke(contextInternal.target, payloads);
LOG.info("Callback transaction with global tx id [{}], local tx id
[{}]", globalTxId, localTxId);
// TODO send TxCompensateSucceedAckEvent to Alpha
} catch (IllegalAccessException | InvocationTargetException e) {
LOG.error(
"Pre-checking for callback method " +
contextInternal.callbackMethod.toString()
+ " was somehow skipped, did you forget to configure callback
method checking on service startup?",
e);
// TODO send TxCompensateFailedAckEvent to Alpha
} finally {
omegaContext.setGlobalTxId(oldGlobalTxId);
omegaContext.setLocalTxId(oldLocalTxId);
}
}
Alpha waits for compensation result and catching exception after calling
compensation method
1. Received TxCompensateSucceedAckEvent: transaction completed
2. Received TxCompensateFailedAckEvent: throw
BusinessCompensationFailureException
3. catch other exception throw OmegaConnectedException
[1]
https://github.com/apache/servicecomb-pack/blob/a89c7cd8b416c9b281fdbe28644cb6b7e2e78f91/omega/omega-context/src/main/java/org/apache/servicecomb/pack/omega/context/CallbackContext.java#L43
[2]
https://github.com/apache/servicecomb-pack/blob/694b8d701097226d898e7a342c902ff711caa3cf/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcOmegaCallback.java#L35
Best regards,
Lei Zhang
On November 25, 2019 at 7:49:47 PM, Zheng Feng ([email protected]) wrote:
Hi,
I wonder how we can diff the "Omega compensation failure" from the
"Business compensation failure" ? the different exception classes ?
Zhang Lei <[email protected]> 于2019年11月25日周一 下午5:32写道:
> Hi, Pack Team
>
> Currently, Alpha compensation mechanism has some defects [1], I plan to
> solve this problem step by step [2]
>
> Step1: Modify the OnConnected method to bidirectional streaming RPC
>
> This will be needed for the Step2
>
> Step2: Custom compensation exception rules to distinguish between
business
> compensation exceptions and framework compensation exceptions for FSM.
>
> After calling the compensation method, Alpha needs to wait for
> Omega to send a compensation result message. The message type is as
> follows:
>
> Successful compensation:
> Business compensation failure:business code throws an exception,
> Do not switch Omega instance and retry(Retry rule is implemented in the
> Step3)
> Omega compensation failure: omega code throws an exception,
> switch other Omega instance and retry(Retry rule is implemented in the
> Step3)
>
>
> Step3. Added retry and timeout rule to compensate for failures
>
> Exceeded the number of retries or timeout will change state to
> suspended
>
> Any Suggestion?
>
> [1] https://github.com/apache/servicecomb-pack/issues/590
> [2] https://github.com/apache/servicecomb-pack/pull/607
>
> Best regards,
> Lei Zhang
>
>
> Best regards,
> Lei Zhang
>