Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Entities in DCPS (DDS)

- Introduce major entities in DCPS (Data-Centric Publish-Subscribe) specification from the class diagram and implementation viewpoints.
- Know the relationships and cardinalities among these entities.
- Discuss two ways (sync, async) to receive notification from DDS middleware and common pitfalls.
- Summarize learning resources.

  • Login to see the comments

Entities in DCPS (DDS)

  1. 1. DDS 中的各種 Entities (Entities in DCPS) 20170220 Taka Wang
  2. 2. In a Nutshell • Introduce major entities in DCPS (Data-Centric Publish-Subscribe) specification from the class diagram and implementation viewpoints. • Know the relationships and cardinalities among these entities. • Discuss two ways (sync, async) to receive notification from DDS middleware and common pitfalls. • Summarize learning resources.
  3. 3. Take Aways For Busy People • Create Few Domain Participants • Create Entities Early • Prefer Waitset over Listener • ⼀一個 publisher/subscriber 上,可以有多個 datawriter/datareader • ⼀一個 datawriter/datareader 只能對應⼀一個 topic (concrete class),但 不同 datawriter/reader 可以對應同⼀一個 topic
  4. 4. Let's Dive Right In
  5. 5. 0. 也許你看過這張概念念圖 但沒有深入了了解各⾃自的⽬目的,也不知道彼此的association 總之就是照抄範例例,創建⼀一堆 entities,然後開始⽤用reader, writer 讀寫
  6. 6. 0.1 DCPS 的模組 (module) 組成 Infrastructure Module Domain Module Publication Module Subscription Module Topic-Definition Module 內含 Entity Entity 是上⾯面四個模組的 abstract base class Source Page 本⽂文略略過(不難理理解),請參參考此⾴頁⾯面
  7. 7. Entity is an Abstract Base Class • An Entity is the common parent for the most important DDS-elements: • DomainParticipant: Application connector to a Network Domain. 
 (是⽤用來來進入不同 Domain 的物件,不同 domain 間訊息不會互通,是隔離的) • Topic: Defines the messages that will be transmitted across the network. • DataWriter: Accessor to write typed data (Topic) into a Domain. • DataReader: Accessor to read typed data (Topic) from a Domain. • Publisher: Aggregation of DataWriter objects, used to disseminate data. • Subscriber: Aggregation of DataReader objects, used to collect data.
  8. 8. 1. Infrastructure Module 主要包括: - Entity 這個抽象基類 - Listener 與 WaitSet 這 兩兩種互動模式 - Qos 與 Status 定義 Source Page
  9. 9. 1.1. Conceptional DataReader Listener Listener 是 middleware ⽤用來來非同步 (async) 的通知應⽤用 程式,有 status 改變了了 Source Page
  10. 10. 1.2. Listener Class Diagram Source Page • 所有的 Entity 都有對應的 Listener • 例例如 DataReaderListener 就是 Data Reader 的 Listener • Listener 定義很多 Callback,⽤用來來 跟應⽤用程式互動, 通知應⽤用程式 Status 發⽣生不同的改變 • 類似 exception handler 機制,如 果 Subscriber 已經處理理這個狀狀態改 變,則上層的 DataReader 就不⽤用 處理理這個改變。反之,⼀一路路往 parent 傳遞 (propagation)。 parent
  11. 11. 1.3. Status and Waitset • Topic, Subscriber, Data Reader 與 Data Writer 四種 Entity 上有對應 的 Status • 請參參考下列列⾴頁⾯面的 Class Diagram 與列列表 • Status • Waitset
  12. 12. 1.4. Conceptional DataReader WaitSet 應⽤用程式將關注的 Condition 丟進 waitset (步驟⼀一),然後等待 StatusCondition 中任⼀一 trigger_value 從 FALSE 變成 TRUE (步驟⼆二), 這時候應⽤用程式主動去拿 等待的結果並做處理理 (步驟三)。換句句話說,應⽤用程式是卡住等待狀狀態改變的。 步驟⼀一通常在應⽤用程式初始化設定,步驟⼆二跟三通常放在應⽤用程式主迴圈中等待 Source Page
  13. 13. 2. Domain Module 主要包括: - Domain Participant 這 個 Entity 抽象類 的 ⼦子 類 - Domain Participant Factory 類 - Domain Participant Listener 類有很多
 factory method Source Page
  14. 14. 2.1 Domain Participant • 因為是 Entity 的⼦子類,所以有 QosPolicies, StatusCondition 與 Listener (詳⾒見見 1. Infrastructure Module 的 class diagram) • Domain Participant 扮演的⾓角⾊色 • 應⽤用程式要進入特定 Domain,需要透過 Domain Participant 建立 Virtual network Link,做到 Physical Network 上不同 DDS 應⽤用隔離互不⼲干擾的效果。 • 是所有 Entities 的⼯工廠 (⾒見見上⾴頁的 Factory methods) • 是所有 Entities (詳⾒見見 0.) 的容器 (container) • 沒有⾃自⼰己專⽤用的 Listener (domain listener) 去聽 domain 狀狀態變化,⽽而是⽤用來來處理理容器內所 有 Entities 沒有處理理的狀狀態變化 (還記得1.1的⼀一路路往 parent 傳遞 (propagation) 嗎?) Source Page
  15. 15. 3. Subscription Module 主要包括下列列四個重要的類別: - Subscriber - DataReader - DataSample - SampleInfo Listener 與 Condition 請參參考前⾯面 介紹 DataReader 加上 Subscriber 形 成 Subscription 概念念 Source Page
  16. 16. 3.1. Subscriber & Sample • Subscriber 主要負責收集來來⾃自不同 Publisher 的資料 • DataReader 不負責從 Network 直接收資料,⽽而是由 Subscriber 決 定何時、如何將資料傳到 DataReader • Subscriber 只收所屬 Partition 的 samples • Subscriber 也是 DataReaders 的⼯工廠 (DomainParticipant 也是) • SampleInfo ⽤用來來描述 Sample 的相關狀狀態 Source Page
  17. 17. 3.2 DataReader • DataReader 是 abstract class, 針對特定 type,有各⾃自的 concrete data reader (例例如 Foo Type 會由 preprocessor 產⽣生 FooDataReader) • Typed DataReader ⽤用來來存取對應 type 的 sample 與其對應的 SampleInfo • DataReader 上有 Listeners, Conditions 與 Qos Source Page
  18. 18. 4. Publication Module 主要包括下列列兩兩個重要的類別: - Publisher - DataWriter DataWriter 加上 Publisher 形成 Publication 概念念 Source Page
  19. 19. Discussion and Best Practices
  20. 20. Prefer Waitset over Listener • 從⽂文件上可以知道 Data Reader 有兩兩種接收資料的⽅方式 • waitset: blocking (透過 condition variable 去卡,類似 Unix Select的⾏行行為) • listener: non-blocking, aka. async (透過 register callback handler) • 如果接收端 (application) 的 waiting loop 並沒有其他⼯工作要做,只是等待資 料進來來做後續處理理,這時候請盡量量使⽤用 waitset。這樣的 code 比較安全 (雖 然有 Context Switch 的 Overhead),除非 callback 內的處理理非常快,追求 extreme 的效能才⽤用 listener (做 benchmark,⽽而不是 production)
  21. 21. Why Waitset? • Listener 的 callback 是被 DDS middleware 的 thread 呼叫的,但 DDS middleware thread 通常都在做 這些事情: • 為各個 Data Reader 收資料 • 收發 metadata 給 Data Writer • 處理理 Deadline 與 Liveliness 之類的 Qos • 呼叫 Callback 時,接收端的 main thread 雖然還在跑 (async),但 DDS middleware 的 thread 此時卡 住,要等 Callback 內的事情處理理完 (寫檔、寫資料庫等等),造成下列列後果: • Data Readers 會漏資料 • 無法正確處理理(通知別⼈人) Liveliness 狀狀態
  22. 22. Notice from documents about listener • PT: Something worth pointing out is that the handler code will execute in a middleware thread. As a result, when using listeners you should try to minimize the time spent in the listener itself. • RTI: While a Listener is used to provide a callback for asynchronous access, Conditions and WaitSets provide synchronous data access. This means that you use a WaitSet to block an application thread until data becomes available. This is safer than using a listener because you do not have to worry about blocking Connext's threads.
  23. 23. Entities management • Create Few DomainParticipants (在⼀一程式中,⼀一個 Domain,⼀一個 DP 就好),否則會浪 費很多系統資源,因為它主要⽤用來來: • DomainParticipants ⽤用來來尋找 Domain 中的其他 Entities,並管理理這些關聯聯 • 創建 Thread • Create Entities Early (不要等到要 Read/Write 才創建 DataWriter/DataReader,程式⼀一開 始初始化時就應該創建) • 需要幫⾃自⼰己 Allocate Queue • 傳送 discovery 訊息通知其他程式,⾃自⼰己已經存在於 Domain 中 (可想⽽而知需要點時間)
  24. 24. Take Aways • Create Few Domain Participants • Create Entities Early • Prefer Waitset over Listener • ⼀一個 publisher/subscriber 上,可以有多個 datawriter/datareader • ⼀一個 datawriter/datareader 只能對應⼀一個 topic (concrete class),但 不同 datawriter/reader 可以對應同⼀一個 topic
  25. 25. Reference • Vortex Lite C99 API Reference Guide (了了解 DCPS 概念念與架構,推薦閱讀⽽而不是只當作 API 查閱⽂文件,與 ISO C++ 章節內容完全相同) • Best Practices using RTI Connext DDS (同樣適⽤用於 PT 的實作,推薦閱讀) • Vortex - The DDS Tutorial (最輕量量化的教學⽂文件,短短20多⾴頁,幫助你掌握八成重要的概 念念) • DataWriters/Publishers and DataReaders/Subscribers (清楚的解釋四種 Entities 的關係) • RTI: WaitSet with Status Condition (介紹 Waitset 概念念) • PT: Reading and Writing Data (介紹 Waitset 與 Listener ⽤用法)
  26. 26. Thank you

×