Hi Nikolai, I need to perform cross cache updates in case of person message and detail message from kafka.
that cross cache updates happens based on person Id which is person cache key. I am using explicit lock on person cache for personId and avoiding the parallel cross cache operations for the same person id. Please let me know if you have any questions. thanks. On 17 March 2017 at 15:30, Nikolai Tikhonov <[email protected]> wrote: > Hi Anil! > > Ignite Transaction API allowed to achieve your requirements. It's allow to > avoid using explicit lock. Could you describe why do you need use explicit > lock in your case? > > On Fri, Mar 17, 2017 at 6:46 AM, Anil <[email protected]> wrote: > >> Hi Nikolai, >> >> Thanks for response. in my usecase, i need to control incoming messages >> so that no two messages of personId process in parallel. i believe this can >> achieved with both explicit locks and entry processor. >> >> Can entryprocessor support cross cache atomicity ? >> >> Thanks >> >> On 17 March 2017 at 01:29, Nikolai Tikhonov <[email protected]> wrote: >> >>> Anil, >>> >>> Yes, you're right that atomic cache doesn't support explicit locks. >>> >>> >I am not sure how entryprocessor invoke behaves in my case. if it is >>> single cache update, that is straight forward. and not sure about >>> transaction for 2-3 operations for 2 caches. >>> EntryProcessor modifies (update/remove/create) only one entry. >>> >>> >I do 2 to 3 updates/puts between two caches like updating parent person >>> info to child person and creating empty detail info by checking detail >>> cache. >>> Ignite supports cross-cache transactions (one transaction can update to >>> several caches) with support ACID . I think that this feature will be >>> helpful for your. >>> >>> On Thu, Mar 16, 2017 at 8:20 PM, Anil <[email protected]> wrote: >>> >>>> Hi Nikolai, >>>> >>>> Thanks for response. >>>> >>>> Distributed locks wont work for atomic caches. correct ? if i remember >>>> it correclty, i see an exception sometime back and then i used >>>> transcational. >>>> >>>> I do 2 to 3 updates/puts between two caches like updating parent person >>>> info to child person and creating empty detail info by checking detail >>>> cache. >>>> >>>> I am not sure how entryprocessor invoke behaves in my case. if it is >>>> single cache update, that is straight forward. and not sure about >>>> transaction for 2-3 operations for 2 caches. >>>> >>>> Thanks. >>>> >>>> On 16 March 2017 at 22:43, Nikolai Tikhonov <[email protected]> >>>> wrote: >>>> >>>>> If your update logic does not contains heavy operations (locks, cache >>>>> puts and etc) and how I see from your comment above this is true you can >>>>> use IgniteCache#invoke [1]. The method provides needed you garanty. Also >>>>> you can change cache mode to ATOMIC for better perfomance. >>>>> >>>>> 1. https://apacheignite.readme.io/docs/jcache#section-entryprocessor >>>>> >>>>> On Thu, Mar 16, 2017 at 7:55 PM, Anil <[email protected]> wrote: >>>>> >>>>>> Hi Nikolai, >>>>>> >>>>>> No. person message and detail message can be executed by different >>>>>> nodes and both messages executes different logics. >>>>>> >>>>>> *Person message* - will update/create person entry into person cache >>>>>> and check the if any detail entry is available or not in detail cache. if >>>>>> exists, updates person info to detail entry. if not, creates empty detail >>>>>> entry >>>>>> *Detail Message* - will check empty detail entry is availble or not. >>>>>> if yes, delete and create new detail entry with personal info. else >>>>>> creates/updates the entry. >>>>>> >>>>>> To avoid data inconsistency, i created lock on person id so messages >>>>>> (person and detail) of person id wont run in parallel. >>>>>> >>>>>> now, i am trying to achieve atomicity for each message operations. >>>>>> Hope this is clear. >>>>>> >>>>>> Thanks, >>>>>> >>>>>> On 16 March 2017 at 22:12, Nikolai Tikhonov <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> Hi Anil! >>>>>>> >>>>>>> If I understood correctly (you need to perform operations on two >>>>>>> caches have exclusive lock on personId) then in your case the better >>>>>>> way is >>>>>>> using Ignite pessimistic transaction: >>>>>>> >>>>>>> personCache = ignite.cache("PERSON_CACHE"); >>>>>>> detailCache = ignite.cache("DETAIL_CACHE"); >>>>>>> >>>>>>> try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, >>>>>>> REPEATABLE_READ)) { >>>>>>> // On this step will be acquired lock on personId >>>>>>> // and only one thread in grid will execute code bellow. >>>>>>> personCache.get(personId); >>>>>>> >>>>>>> // cache put,remove,invoke and etc. >>>>>>> tx.commit(); >>>>>>> } >>>>>>> >>>>>>> Is't work for you? >>>>>>> >>>>>>> On Thu, Mar 16, 2017 at 3:09 PM, Anil <[email protected]> wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I need to make sure that entries are added correctly in two caches. >>>>>>>> >>>>>>>> I have two caches Person and Detail. personId is the key for >>>>>>>> Person cache and detailedId is the key for Detail cache. >>>>>>>> >>>>>>>> Each Detail cache entry would have some information of Person cache >>>>>>>> entry based on personId. and i am adding entries to caches using Kafka. >>>>>>>> >>>>>>>> When Person and Detail messages are processed, order cannot be >>>>>>>> maintained and processed by different nodes. So to avoid data >>>>>>>> inconsistency >>>>>>>> issues - i did following. >>>>>>>> >>>>>>>> *Person message :* >>>>>>>> >>>>>>>> Locl lock = personCache.lock(personId); >>>>>>>> lock.lock(); >>>>>>>> >>>>>>>> // update person operations for both person cache and detail cache >>>>>>>> >>>>>>>> lock.unlock(); >>>>>>>> >>>>>>>> *Detail Mesage :* >>>>>>>> >>>>>>>> >>>>>>>> Locl lock = detailCache.lock(personId); // person id from detail >>>>>>>> message >>>>>>>> lock.lock(); >>>>>>>> >>>>>>>> // update person operations for both person cache and detail cache >>>>>>>> >>>>>>>> lock.unlock(); >>>>>>>> >>>>>>>> with this, till one of the message processed for same person Id, >>>>>>>> other would not acquire lock. >>>>>>>> >>>>>>>> now how to maintain the ACID for update operations ? ignite >>>>>>>> transactions does not work inside lock. Is there anyway to achieve the >>>>>>>> above usecase with ACID ? >>>>>>>> >>>>>>>> Thanks >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >
